Python 快速排序的思考(快排 & K-th Max)

一、 快速排序与归并排序的比较

快速排序的最快的时间复杂度为O(n),最差情况下的时间复杂度为O(n^2),平均的时间复杂度为O(nlgn);
归并排序的时间复杂度在任何情况下都是O(nlgn);

快速排序的时间复杂度计算

每一轮快速排序的时间负责度都是O(n), 平均一共有lgn轮,故整体的平均时间复杂度为O(nlgn);

二、 快速排序思想

  1. 循环不变式:每一轮针对比较的值,在一轮完成之后,会移动到最终正确的位置。
  2. 排序特点:对于其中被选取参与排序的元素N,当其针对的排序完成后,左侧的元素都小于(大于)等于该元素,右侧的元素都大于(小于)等于该元素;
  3. 快排经典变种简化:Kth-max问题。
  4. 快速排序是的时间复杂度是平均时间复杂度,不同的初始情形,快排的时间复杂度不同。快排最差的情况有一下三种

(1)数组倒序有序;
(2)数组倒序有序;
(3)所有的元素都相同(1、2的特殊情形)

三 快速排序实现代码

# coding=utf-8
# environment: python3

def sort(array, low ,high):
    pivot = array[low]
    while low < high:
        while low < high and array[high] >= pivot:
            high -= 1
        while low < high and array[low] <= pivot:
            low += 1
        array[high] = array[low]
        array[low] = pivot
    return low

def quick_sort(array, low, high):
    # init the recursive function.
    if low < high:
        pivot_loc = subsort(array, low, high)
        quick_sort(array, low, pivot_loc-1)
        qucik_sort(array, pivot_loc+1, high)

if __name__ == "__main__":
    array = [49,38,65,97,76,13,27]
    print(array)
    # round 1 [38, 13, 27, ]
    quick_sort(array,0,len(array)-1)
    # after sort: [13, 27, 38, 49, 65, 76, 97]
    print(array)

四、 引申:Kth-Max问题思考

利用快排思路解决Kth-Max问题:
这里假设其中一个参与的元素X,其对应的下标为X.index;
由前文可知,每一轮快排都会使当前的元素N放置到最终的正确位置中,且左边的数字都小于等于X,右边的元素都大于等于X,故考虑元素X的位置,有以下三种情形:

  1. 若X的下标(降序排序)等于K,则X左方加上X本身为整个数组最大的K个元素,满足问题需求,返回结果;
  2. 若X的下标(降序排序)大于K,则针对下标范围为[X.index+ 1 : K]的子数组进行快速排序,直到满足要求1;
  3. 若X的下标(降序排序)小于K,则针对下标范围为[K + 1 : ]的子数组进行快速排序,直到满足要求1;

综上,当数组长度为N时,Kth-Max算法采用快排思想,平均的时间复杂度为(N/2 + N/4 + N/8 + ... + N/2^i),易证时间复杂度为O(N)。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 算法思想贪心思想双指针排序快速选择堆排序桶排序荷兰国旗问题二分查找搜索BFSDFSBacktracking分治动态...
    第六象限阅读 10,197评论 0 0
  • 该系列文章主要是记录下自己暑假这段时间的学习笔记,暑期也在实习,抽空学了很多,每个方面的知识我都会另起一篇博客去记...
    Yanci516阅读 14,235评论 6 19
  • 坐在离离芳草中,认真听一首歌,深深浅浅置于其中,不被带走。多久没有这样的感受了? 躺在这最高处看云,连绵的云漫天铺...
    圆脸狸阅读 3,459评论 0 0
  • 其实我是一个超级精致的仙女 我有一个很朴素的爱好 喜欢淘各种各样物美价廉的好物 说白了就是 “别看我穷,但是我懂得...
    菜菜小仙女阅读 1,157评论 0 0
  • 说到改变,或许我是最不愿改变的人。或许是因为自己比较念旧。有很多的时候,对一些人和事物的记忆会一直比较深刻。 最近...
    豆豆在成长阅读 1,184评论 0 0

友情链接更多精彩内容