往期推荐:
这期讲快排,即快速排序,快速排序也是一种递归排序,是一种用简单方法来解决困难问题的典型案例,缺点是有点浪费空间。
目录
五、快速排序
原理
快速排序是选择列表中任意一个数为基准,我们通常选用列表中的第一个数,将列表分为左右两个子序列,左边的子序列存放比基准小的数,右边存放比基准大的数。然后再把左边子序列和右边子序列按照同样的方法进行分解、比较,一直到分无可分为止;然后再按照左边子列表(比基准数小)+基准数+右边子列表(比基准数大)的公式将数字连接起来,最后就能得到一个完整有序数列。
举例
还是以我们的数列[7,3,5,1,9,4]为例。
第一次分组
首先以第一个数7为基准数,分为左右两个子序列,左边子序列比基准数7小,分别为[3,5,1,4],右边子序列比基准数7大为[9]。
左边子序列 | 3 | 5 | 1 | 4 | 基准数 | 7 | 右边子序列 | 9 |
第二次分组
右边子序列只有一个数字,说明已经划分到了最小单元,可以不用划分了,之后的分组也不用考虑这个右边子序列[9]了。
左边子序列在按照左+基准+右的公式来划分;基准数为左边子序列的第一个数字3,我们根据算法思想得到一下划分结果:
左边子序列 | 1 | 基准数 | 3 | 右边子序列 | 5 | 4 |
第三次分组
这次的左边子序列只剩一个元素了,不用划分我们看右边子序列,右边子序列元素个数为2,需要继续划分。
以右边子序列第一个元素5为基准,进行划分,划分结果如下:
左边子序列 | 4 | 基准数 | 5 |
现在所有序列都已经划分完毕了,我们可以按照公式给它们合并起来了。
第一次合并
左边子序列 | 4 | 基准数 | 5 |
左边子序列+基准数+右边子序列=[4]+[5]+[ ];
合并结果为[4,5]
第二次合并
左边子序列 | 1 | 基准数 | 3 | 右边子序列 | 4 | 5 |
左边子序列+基准数+右边子序列=[1]+[3]+[4,5];
合并结果为[1,3,4,5]
第三次合并
左边子序列 | 1 | 3 | 4 | 5 | 基准数 | 7 | 右边子序列 | 9 |
左边子序列+基准数+右边子序列=[1,3,4,5]+[7]+[9];
合并结果为[1,3,4,5,7,9]
快速排序结束。
快速排序算法最坏情况下的时间复杂度为。
源码
QuickSort.py
from randomList import randomList
import timeit
iList = randomList(20)
def quickSort(iList):
if len(iList) <= 1:
return iList
left = []
right = []
for i in iList[1:]:
if i <= iList[0]:
left.append(i)
else:
right.append(i)
return quickSort(left) + [iList[0]] + quickSort(right)
if __name__ == "__main__":
print(iList)
print(quickSort(iList))
print(timeit.timeit("quickSort(iList)", "from __main__ import quickSort,iList", number=100))
明天讲计数排序,一起加油鸭~
欢迎点赞、关注、收藏~