剑指offer:040找出无序数组中前K小的数

# 利用快排思想
class Solution:
    def function(self, array, K):
        index = self.partition(array, 0, len(array)-1)
        while index != K-1:
            if index > K-1:
                index = self.partition(array, 0, index-1)
            if index < K-1:
                index = self.partition(array, index+1, len(array)-1)
        print(array[0:K])

    def partition(self, array, start, end):
        i = start
        j = end
        while i < j:
            while array[j] >= array[start] and i < j:  # 必须左边先动 以数组第一个数作为哨兵,找到小于(不能小于等于,不然会卡在哨兵那里)哨兵的数
                j -= 1
            while array[i] <= array[start] and i < j:  # 以数组第一个数作为哨兵,找到大于(不能大于等于)哨兵的数
                i += 1
            # 交换
            temp = array[j]
            array[j] = array[i]
            array[i] = temp
        """
        当指针相碰的时候,指针指向的数,一定大于哨兵
        指针相碰的两种情况:
        1.j向左一步,与i相碰
        1.1 i没有动过
            相碰的地方是哨兵
        1.2 i动过
            根据上一次的交换,i指向的数字一定是小于哨兵,所以i指向的数与哨兵交换,合理
        2.i向右一步,与j相碰
        这种情况只发生在j没有动过的时候,相碰的地方就是最后一个数据,因为程序里面是j先动,根据上次的交换,array[j],一定大于哨兵
        即满足j移动的条件。
        综上,最后i指向的数子一定小于等于哨兵,(等于仅仅在1.1情况发生),所以,再进行一次交换,一趟完成
        """
        temp = array[start]
        array[start] = array[i]
        array[i] = temp
        return i


if __name__ == '__main__':
    # 测试用例
    a = [99, 2, 1, 4, 5, 6, 9, 8, -1]
    s = Solution()
    s.function(a, 5)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值