通过快速排序,然后取最小的k个数。
# -*- coding:utf-8 -*-
class Solution:
def GetLeastNumbers_Solution(self, tinput, k):
# write code here
def quick_sort(left,right):
i=left
j=right
if i>j:
return
while i<j:
while tinput[j]>tinput[left] and i<j:
j-=1
while tinput[i]<=tinput[left] and i<j:
i+=1
tinput[i],tinput[j]=tinput[j],tinput[i]
tinput[left],tinput[i]=tinput[i],tinput[left]
quick_sort(left, i-1)
quick_sort(i+1, right)
if k<0 or k>len(tinput):
return []
quick_sort(0,len(tinput)-1)
return tinput[:k]
归并排序,先分开,分到只剩一个元素,然后再将元素放在一起。
其中两个数组中元素放在一起时,可以通过result+=left[i:] result+=right[j:] 加入剩下的元素。
# -*- coding:utf-8 -*-
class Solution:
def GetLeastNumbers_Solution(self, tinput, k):
# write code here
def merge(linput,rinput):
result=[]
l=len(linput)
r=len(rinput)
if l==0 or r==0:
return
i=0
j=0
while i<l and j<r:
if linput[i]<rinput[j]:
result.append(linput[i])
i+=1
else:
result.append(rinput[j])
j+=1
# if i<l:
# while i<l:
# result.append(linput[i])
# i+=1
# if j<r:
# while j<r:
# result.append(rinput[j])
# j+=1
result+=linput[i:]
result+=rinput[j:]
return result
def merge_sort(left,right):
if left==right:
return [tinput[left]]
mid=(right-left)//2+left
left_sort=merge_sort(left,mid)
right_sort=merge_sort(mid+1,right)
return merge(left_sort,right_sort)
if k<0 or k>len(tinput) or len(tinput)==0:
return []
tresult=merge_sort(0,len(tinput)-1)
return tresult[:k]堆排序 先从最后一个非叶子节点一直到0结点,(n-1)//2-0 调整(初始化)堆。然后将首尾位置结点交换,继续调整堆。调整是通过判断左右结点哪一个更大,是否大于父节点,来判断进行交换。有几种方式,一种最开始结点一步到位交换到最终位置,一种是通过一直交换位置,到达最合适的位置。
# -*- coding:utf-8 -*-
class Solution:
def GetLeastNumbers_Solution(self, tinput, k):
# write code here
def adjust_head(tinput,startpos,endpos):
#temp=tinput[startpos]
childpos=2*startpos+1
while childpos<=endpos:
rightpos=childpos+1
if rightpos<=endpos and tinput[rightpos]>=tinput[childpos]:
childpos=rightpos
if tinput[childpos]>tinput[startpos]: # 如果大于最开始遍历的结点值,那么就交换,这样最开始的结点可以放在最适合他的位置上
tinput[startpos],tinput[childpos]=tinput[childpos],tinput[startpos]#直接交换 最开始结点值不一定落在最终位置上
startpos=childpos
childpos=2*startpos+1
# else:
# break
#tinput[startpos]=temp
n=len(tinput)
lastparent=(n)//2
for i in range(1,lastparent+1):
adjust_head(tinput,lastparent-i,n-1)
for i in range(n-1,-1,-1):
tinput[0],tinput[i]=tinput[i],tinput[0]
adjust_head(tinput,0,i-1)
if k<0 or k>len(tinput) or len(tinput)==0:
return []
return tinput[:k]
也可以两个循环 都从下至上,从最后一个非叶子结点到根节点。
n=len(tinput)
lastparent=(n)//2
for i in range(1,lastparent+1):
adjust_head(tinput,lastparent-i,n-1)
for i in range(n):
lastparent=(n-i-1)//2
tinput[0],tinput[n-i-1]=tinput[n-i-1],tinput[0]
for t in range(1,lastparent+1):
adjust_head(tinput,lastparent-t,n-i-2)
if k<0 or k>len(tinput) or len(tinput)==0:
return []
return tinput[:k]
京公网安备 11010502036488号