快速排序
Posted yu-liang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快速排序相关的知识,希望对你有一定的参考价值。
快速排序:通过一趟排序把数组分成两个部分,其中一部分的值全大于另一部分的值,再分别对这两部分排序
1 #对A[p,r]进行快速排序 2 def quicksort(A, p, r): 3 if p < r: 4 q = partition(A, p, r)#计算分块下标q 5 quicksort(A, p, q - 1)#对前面进行快速排序 6 quicksort(A, q + 1, r)#对后面进行快速排序 7 8 #计算分块下标, 9 def partition(A, p, r): 10 x = A[r]#主元 11 i = p - 1 12 for j in range(p, r): 13 #把每个元素和主元比较, 14 #如果比主元大或等于,不做操作 15 if A[j] < x:#如果比较的元素比主元小, 16 i += 1#把记录的最后一个比主元小的元素的坐标+1 17 A[i],A[j]=A[j],A[i]# 把当前的元素A【j】和A【i】交换 18 #通过A[r]改变A【i+1】 19 A[r] = A[i + 1] 20 A[i + 1] = x 21 return i + 1 22 23 A=[2,8,7,1,3,5,6,4] 24 print(partition(A, 0, 7)) 25 print(A) 26 quicksort(A,0,7) 27 print(A) 28 ---------------------------- 29 3 30 [2, 1, 3, 4, 7, 5, 6, 8] 31 [1, 2, 3, 4, 5, 6, 7, 8]
随机选取主元:
1 #计算分块下标, 2 def partition(A, p, r): 3 x = A[r]#主元 4 i = p - 1 5 for j in range(p, r): 6 #把每个元素和主元比较, 7 #如果比主元大或等于,不做操作 8 if A[j] < x:#如果比较的元素比主元小, 9 i += 1#把记录的最后一个比主元小的元素的坐标+1 10 A[i],A[j]=A[j],A[i]# 把当前的元素A【j】和A【i】交换 11 #通过A[r]改变A【i+1】 12 A[r] = A[i + 1] 13 A[i + 1] = x 14 return i + 1 15 16 import random 17 18 def randomized_quicksort(A, p, r): 19 if p < r: 20 q = randomized_partition(A, p, r) 21 randomized_quicksort(A, p, q - 1) 22 randomized_quicksort(A, q + 1, r) 23 24 def randomized_partition(A, p, r): 25 i = random.randint(p, r) 26 A[i],A[r-1]=A[r-1],A[i] 27 return partition(A,p,r) 28 29 A=[2,8,7,1,3,5,6,4] 30 print(randomized_partition(A, 0, 7)) 31 print(A) 32 randomized_quicksort(A,0,7) 33 print(A) 34 ----------------------------------------- 35 3 36 [2, 3, 1, 4, 8, 5, 7, 6] 37 [1, 2, 3, 4, 5, 6, 7, 8]
以上是关于快速排序的主要内容,如果未能解决你的问题,请参考以下文章