快速排序
快速排序的最坏运行情况是 O(n²),比如说顺序数列的快排。但它的平摊期望时间是 O(nlogn),且 O(nlogn) 记号中隐含的常数因子很小,比复杂度稳定等于 O(nlogn) 的归并排序要小很多。所以,对绝大多数顺序性较弱的随机数列而言,快速排序总是优于归并排序。----《算法艺术与信息学竞赛》
算法流程:
1.从数列中挑出一个基准元素;
2.依据基准元素,将其余元素大于基准元素的放其右边,小于基准元素的放其左边;(此时将原数列分成两个分区)
3.递归地对两个分区进行1,2步的分区操作
1 def partition_(arr, left_index, right_index): 2 mid = arr[left_index] 3 while left_index < right_index: 4 while left_index < right_index and arr[right_index] >= mid: 5 right_index -= 1 6 arr[left_index] = arr[right_index] 7 # print(arr, 'right') 8 while left_index < right_index and arr[left_index] <= mid: 9 left_index += 1 10 arr[right_index] = arr[left_index] 11 # print(arr, 'left') 12 arr[left_index] = mid 13 print(arr) 14 return left_index 15 16 def sort_quick(arr, left_index, right_index): 17 if left_index < right_index: 18 part_index = partition_(arr, left_index, right_index) 19 sort_quick(arr, left_index, part_index-1) 20 sort_quick(arr, part_index+1, right_index) 21 22 li = list(range(10, 0, -1)) 23 random.shuffle(li) 24 print(li) 25 sort_quick(li, 0, len(li)-1)
执行结果:
[4, 2, 6, 3, 9, 1, 10, 5, 7, 8]
[1, 2, 3, 4, 9, 6, 10, 5, 7, 8]
[1, 2, 3, 4, 9, 6, 10, 5, 7, 8]
[1, 2, 3, 4, 9, 6, 10, 5, 7, 8]
[1, 2, 3, 4, 8, 6, 7, 5, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]