【菜鸡刷题-牛客网NC88】寻找第K大数字 || 递归快排 || 二分递归快排 || python


@author = YHR | 代码原创 | 创作不易,转载请标明来源!


文章目录

  • 题目描述
  • 普通快排 - 从大到小
  • 二分快排 - 从大到小


题目描述

有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。
给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。

注意,第K大,是从大到小,下标为第K-1个数!

【菜鸡刷题-牛客网NC88】寻找第K大数字 || 递归快排 || 二分递归快排 || python_第1张图片


普通快排 - 从大到小

不多作介绍了,大家可以自行查询快排的原理~

	def fast_sort(self, a, low, high):
        if low < high:
            Pos = self.getFinalPosOfFastSort(a, low, high)
            self.fast_sort(a, low, Pos-1)
            self.fast_sort(a, Pos+1, high)
        pass

这里用的是优化法,减少temp赋值给别人的次数~
从大到小 的快排排序

    
    def getFinalPosOfFastSort(self, a, low, high):
        temp = a[low]

        while low < high:
            while low < high and a[high] <= temp:
                high -= 1

            if low < high:
                a[low] = a[high]
                low += 1

            while low < high and a[low] >= temp:
                low += 1

            if low < high:
                a[high] = a[low]
                high -= 1

        a[low] = temp
        return low

二分快排 - 从大到小

如果: K < 当前返回的Pos, 则一定在Pos 左半部分找。
如果: K > 当前返回的Pos, 则一定在Pos 右半部分找。
如果: K = 当前返回的Pos, 直接返回当前位置。 且一定会遇到这种情况!

 	def half_fast_sort(self, a, low, high, K):
        kpos = -1
        if low < high:
            Pos = self.getFinalPosOfFastSort(a, low, high)
            if Pos == K:
                kpos = a[Pos]
            elif Pos > K:
                kpos = self.fast_sort(a, low, Pos-1, K)  #  find first half part
            elif Pos < K:
                kpos = self.fast_sort(a, Pos+1, high, K)  # find later half part
        return kpos
    
    def getFinalPosOfFastSort(self, a, low, high):
        temp = a[low]

        while low < high:
            while low < high and a[high] <= temp:
                high -= 1

            if low < high:
                a[low] = a[high]
                low += 1

            while low < high and a[low] >= temp:
                low += 1

            if low < high:
                a[high] = a[low]
                high -= 1

        a[low] = temp
        return low

你可能感兴趣的:(数据结构与刷题,快速排序,数据结构)