Quicksort

Quicksort是一个分而治之的算法,它根据主元把一个大数组分成2个小数组:其中1个数组的元素要比主元小,另一个要比主元大。Quicksort至今依然是一个常用的排序算法,如果算法实现好的情况下,它的速度要比merge sort 和 heapsort快2到3倍。一个有效实现地Quicksort 并不是一个stable sort,即相等元素的相对顺序不能被保证。Quicksort 也可以在一个数组上进行原址排序。数学分析表明,quicksort排序n个元素平均需要O(nlogn)O(nlogn) 比较,在最坏的情况下,它需要O(n2)O(n2)次比较,虽然这样的行为不常见。

Quicksort的步骤

Quicksort主要包含以下3步:

  1. 从数组中取出一个元素,叫做主元(pivot)
  2. 重排序数组,使得所有小于pivot的元素在它前面,所有大于pivot的元素在它后面,等于pivot的元素放在哪面都行。这样的划分以后,pivot的位置已经排好了。这个过程叫做partition操作
  3. 递归地应用步骤2到小于pivot的子数组和大于pivot的子数组
    在上面的步骤中,递归的base case是数组的大小为0或1,因为这样的数组已经有序,不需要再排序。我们有很多方式来选择pivot,不同地方式会对算法的性能有很大地影响。
$
def partition(a, l, r):
    i = l
    j = r
    while i < j:
        while a[i] < a[l] and i < j:
            i += 1

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

        if i < j:
            temp = a[i]
            a[i] = a[j]
            a[j] = temp

    temp = a[l]
    a[l] = a[j]
    a[j] = temp
    return j


 def quick_sort(a, l, r):
    if l < r:
        index = partition(a, l, r)
        sort(a, l, index - 1)
        sort(a, index + 1, r)

    return a


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

相关阅读更多精彩内容

友情链接更多精彩内容