快速排序
函数伪代码:
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