剑指offer:最小的k个数

…衆ロ難τιáo~ 提交于 2020-03-08 00:30:18

题目描述
输入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
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!