快速排序

快速排序

函数伪代码:

partition(A,p,q) //意思是对数组A的[p,q]段元素进行快速排序
    x ← A[p]  //设置A[p]为主元
    i ← p //设置i指针,指向主元元素
    for j ← p+1 to q  //j指针从主元元素的后一个位置开始,一直移到最后
        do if A[j] <= x
            then i ← i+1
                exch A[i] ←→ A[j]  //交换A[i]和A[j]
    exch A[p] ←→ A[i]  //循环结束后,交换i指针当前指向的元素A[i]和主元元素A[p]
    return i  //返回i,i指向的就是主元元素


quicksort(A,p,q)
    if p < q
    then r ← partition(A,p,q) //r得到分划的结果(r就是主元)
        quicksort(A,p,r-1)  //快排左子串
        quicksort(A,r+1,q) //快排右子串
initCall()
    quicksort(A,1,n)  //初始化

python代码:

# 对array[low, high]进行快速排序
def QuickSort(array, low, high):
    if low >= high:
        return
    if low < high:
        r = Partition(array, low, high) # r是切分点的下标,左边的值都小于等于array[r],右边的都大于等于array[r]
        QuickSort(array, low, r) # 不能写成r-1,python和c++不一样,python是前闭后开区间,相当于array[low,r)
        QuickSort(array, r + 1, high)  # array[r+1, high)  array[r]位置存放的是主元,已经排好序了

def Partition(array, low, high):
    # print(low, high)
    if low >= high:
        return
    pivot = array[low]

    # array[low+1, j]  < pivot, array[j+1, i] > pivot, i是待比较元素的下标
    j = low
    for i in range(j + 1, high):
        if array[i] <= pivot:
            j += 1
            array[j], array[i] = array[i], array[j]
    array[low], array[j] = array[j], array[low]
    return j


nums = [6,10,13,5,8,3,2,11]
QuickSort(nums, 0, len(nums))
print(nums)

算法适用于处理——无重复数据的数组,有重复项的可以用Hoare算法。

算法复杂度分析:

  • 最坏情况
    输入数据本身已经排序或逆排序,划分的一侧始终无元素。
    T(n)=T(0)+T(n-1)+Θ(n)
    =Θ(1)+T(n-1)+Θ(n)
    =T(n-1)+Θ(n)
    =Θ(n^2)(递归树法)
  • 一般情况
    Θ(nlogn)

参考:
算法导论公开课笔记 https://blog.csdn.net/rye_whiskey/article/details/82216352
快速排序的python实现 //www.cnblogs.com/feichangnice/p/5334195.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值