版权声明:本文为博主原创文章,如有转载请标注来源。 https://blog.csdn.net/shengchaohua163/article/details/83217290
第7章 快速排序
1. 快速排序
快速排序是一种最坏情况时间复杂度为 的排序算法。虽然最坏情况很差,但是快速排序通常是实际排序应用中最好的选择。因为它的平均性能非常好:期望时间复杂度为 ,而且其中隐含的常数因子非常小。另外,它还是原址排序,空间复杂度为 。
下面实现了书中的伪代码和习题,包括:
- P95:QUICKSORT,快速排序,初始调用为QUICKSORT(A, 0, A.length-1),见quick_sort。
- P95:PARTITION,快速排序中的数组划分,实现了对子数组A[p…r]的原址重排,见partition。
- P100:RANDOMIZED-PARTITION和RANDOMIZED-QUICKSORT,随机选取主元的划分和对应的快速排序,见randomized_partition和randomized_quick_sort。因为主元元素是随机选取的,我们期望在平均情况下,对输入数组的划分是比较均衡的。
- P103:思考题7-1,Hoare划分,见hoare_partition和hoare_quick_sort。
def quick_sort(A, p, r):
if p < r:
q = partition(A, p, r)
quick_sort(A, p, q-1)
quick_sort(A, q+1, r)
def partition(A, p, r):
x = A[r]
i = p - 1
for j in range(p, r):
if A[j] <= x:
i += 1
A[i], A[j] = A[j], A[i]
A[i+1], A[r] = A[r], A[i+1]
return i + 1
def randomized_partition(A, p, r):
import random
i = random.randint(p, r)
A[i], A[r] = A[r], A[i]
return partition(A, p, r)
def randomized_quick_sort(A, p, r):
if p < r:
q = randomized_partition(A, p, r)
randomized_quick_sort(A, p, q-1)
randomized_quick_sort(A, q+1, r)
def hoare_partition(A, p, r):
x = A[p]
i = p
j = r
while True:
while j > i and A[j] >= x:
j -= 1
while i < j and A[i] <= x:
i += 1
if i < j:
A[i], A[j] = A[j], A[i]
else:
A[p] = A[j] #书上的伪代码有问题 缺少这两步
A[j] = x
return j
def hoare_quick_sort(A, p, r):
if p < r:
q = hoare_partition(A, p, r)
hoare_quick_sort(A, p, q-1)
hoare_quick_sort(A, q+1, r)
def test():
A = [2, 8, 7, 1, 3, 5, 6, 4] # P96例子
quick_sort(A, 0, len(A)-1)
print(A)
A = [2, 8, 7, 1, 3, 5, 6, 4]
randomized_quick_sort(A, 0, len(A)-1)
print(A)
A = [13, 19, 9, 5, 12, 8, 7, 4, 11, 2, 6, 21] # P103思考题7-1
hoare_quick_sort(A, 0, len(A)-1)
print(A)
if __name__ == '__main__':
test()