针对快速排序算法执行耗时的分析
阅读某道数据结构考研书时发现一题:已知当前排序算法为快速排序算法,问ABCD所给出的4个序列,哪一个排序最快,哪一个最慢。个人认为答案分析欠妥,遂做些实验进行分析。
实验的快排代码
def partition(a, low, high):
tmp = a[low]
while low < high:
while low < high and a[high] >= tmp:
high -= 1
a[low] = a[high]
while low < high and a[low] <= tmp:
low += 1
a[high] = a[low]
a[low] = tmp
return low
def quick_sort(a, start, end):
if start < end:
pos = partition(a, start, end)
quick_sort(a, 0, pos - 1)
quick_sort(a, pos + 1, end)
实验设定随机生成一个长度为15的数组a
,对a按照升序进行排序后存为b
,降序排序后存为c
,实验需求为升序排序。
实验中,每个数组执行快排10w
次,分别统计执行时间。
分析
- 若当前序列关键字有序,且与需求中的顺序相同,则用时一般较少(序列升序 / 降序,题目要求结果恰好也为升序 / 降序);
- 若当前序列关键字有序,但与需求中的顺序相反,则用时一般较多(序列升序 / 降序,题目要求结果反而变为降序 / 升序);
- 其余情况介于两者之间。
晚上进行了100w
次的实验,结果反而表现出了随机性:
Random list under QuickSort time: 0:14:57.409429
Sorted list under QuickSort time: 0:14:42.841151
Sorted reverse list under QuickSort time: 0:14:46.816652
总结
快速排序算法执行用时和需求与序列状态有一定关系,但不是绝对的。
若当前序列关键字有序,且与需求中的顺序相同,则用时一般较少(序列升序 / 降序,题目要求结果恰好也为升序 / 降序)