06-20:刷题综合三:快排

快排:

1、快速排序

2、快速排序寻找第K个大

3、最小的K个数

1、手写快排算法

class Solution:

    def MySort(self , arr ):

        # write code here

        if not arr:

            return

        def q_sort(arr,left,right):

            i=left

            j=right

            if i<j:

              while i<j:

                while i<j and arr[j]>=arr[left]:

                    j=j-1

                while i<j and arr[i]<=arr[left]:

                    i=i+1

                arr[i],arr[j]=arr[j],arr[i]

              arr[left], arr[i] = arr[i], arr[left]

              q_sort(arr,left,i-1)

              q_sort(arr,i+1,right)

            return arr

        return q_sort(arr,0,len(arr)-1)

快排的核心算法可拆分为两步:

1)划分,把最左边的划分到正确的位置上

2)递归排序,左半部分和右半部分

2、寻找第K大的数

def findKth(self, a, n, K):

        #划分找出来分界点

        def partition(nums,left,right):

            p=nums[left]

            while left<right:

                while left<right and nums[right]>=p:

                    right=right-1

                nums[left]=nums[right]

                while  left<right and nums[left]<=p:

                    left=left+1

                nums[right]=nums[left]

            nums[left]=p

            return left

        def q_sort(nums,left,right,k):

            if left<=right:

                p=partition(nums,left,right)

                if  p== n-k:

                    return nums[p]

                elif p < n-k:

#不断递归寻找划分点

                    return q_sort(nums,p+1,right,k)

                else:

                    return q_sort(nums,left,p-1,k)

        return q_sort(a,0,n-1,K)

3、最小的k个数基于快排:

核心代码如下:

if k >= len(arr): return arr

        def quick_sort(l, r):

            i, j = l, r

            while i < j:

                while i < j and arr[j] >= arr[l]: j -= 1

                while i < j and arr[i] <= arr[l]: i += 1

                arr[i], arr[j] = arr[j], arr[i]

            arr[l], arr[i] = arr[i], arr[l]

#不断递归排序

            if k < i: return quick_sort(l, i - 1)

            if k > i: return quick_sort(i + 1, r)

            return arr[:k]

        return quick_sort(0, len(arr) - 1)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一趟结束后能够确定一个元素的最终位置的排序方法有: 简单选择排序、快速排序、冒泡排序、堆排序 稳定性定义:排序前后...
    Zak1阅读 310评论 0 0
  • 3-1.数组中重复的数字 思路分析:如果不考虑时间复杂度,则可以先对数组排序(需要 的时间),然后再从中找重复的...
    oneoverzero阅读 403评论 0 1
  • ● 如何打印二叉树每层的节点? 考察点:二叉树 参考回答: 实现代码: import java.util.Arra...
    le_u阅读 509评论 0 0
  • 表情是什么,我认为表情就是表现出来的情绪。表情可以传达很多信息。高兴了当然就笑了,难过就哭了。两者是相互影响密不可...
    Persistenc_6aea阅读 126,057评论 2 7
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 6,108评论 0 4