Loading

快速排序

快速排序的最坏运行情况是 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]

posted @ 2021-07-12 14:40  climber_dzw  阅读(53)  评论(0编辑  收藏  举报