题目描述
输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。
堆排序,牛客网调烦了跑到力扣调,还是力扣界面比较舒服…
其实还可以优化一下,初始化之后调整k次可以输出后k位。也可以用冒泡、快排,但是冒泡数据大了就不好跑了,快排写的循环太多会超时
堆排序参考:数组排序——堆排序
# -*- coding:utf-8 -*-
class Solution:
def GetLeastNumbers_Solution(self, tinput, k):
# write code here
if not tinput or k>len(tinput):
return []
tinput=self.HeapSort(tinput,len(tinput)-1)
return tinput[:k]
def HeapSort(self,tinput,end):
i=end/2
while i>=0:#初始化最大堆
self.sift(tinput,i,end)
i-=1
for i in range(end):#每一次取出堆顶,与堆底交换,再调整堆
temp=tinput[0]
tinput[0]=tinput[end-i]
tinput[end-i]=temp
self.sift(tinput,0,end-i-1)
return tinput
def sift(self,tinput,i,end):#i是要调整的结点,end是堆的最后一个结点
k=i
j=2*k+1#j是k的左孩子结点
while j<=end:
if j<end and tinput[j]<tinput[j+1]:
j+=1#找出左孩子和右孩子中更大的那一个
if tinput[j]<tinput[k]:#孩子结点小于父结点
break#无需改变
else:
temp=tinput[k]
tinput[k]=tinput[j]
tinput[j]=temp
k=j
j=2*k+1
快排(超时
# -*- coding:utf-8 -*-
class Solution:
def GetLeastNumbers_Solution(self, tinput, k):
# write code here
if not tinput or k>len(tinput):
return []
tinput=self.quicksort(tinput,0,len(tinput)-1)
return tinput[:k]
def quicksort(self,arr,left,right):
if left>=right:
return
low=left
high=right
key=arr[low]
while left<right:
#从右向左找到第一个小于key的值
while left<right and arr[right]>key:
right-=1
arr[left] = arr[right]
#从左向右找到第一个大于key的值
while left<right and arr[left]<key:
left+=1
arr[right]=arr[left]
arr[right]=key
self.quicksort(arr,low,left-1)
self.quicksort(arr,left+1,high)
return arr
来源:CSDN
作者:dene_jucember
链接:https://blog.csdn.net/dene_jucember/article/details/104718241