数据结构与算法笔记—— 快速排序
Posted 别呀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构与算法笔记—— 快速排序相关的知识,希望对你有一定的参考价值。
什么是快速排序
快速排序(英语:Quicksort),又称为交换排序,通过一趟排序将要排序的数据分割为 独立的两部分。假设要排序的列表是 A[0]……A[N-1],首先任意选取一个数据(通常选用 列表的第一个数)作为基准数据,然后将所有比它小的数都放到它左边,所有比它大的数都 放到它右边,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算 法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动。
步骤
-
设置两个变量 low、high,排序开始的时候:low=0,high=N-1;
-
以第一个列表元素作为基准数据,赋值给 mid,即 mid=A[0];
-
从 high 开始向前搜索,即由后开始向前搜索(high–),找到第一个小于 mid 的值 A[high],将 A[hight]和 A[low]的值交换;
-
从 low 开始向后搜索,即由前开始向后搜索(low++),找到第一个大于 mid 的 A[low],将 A[low]和 A[high]的值交换;
-
重复第 3、4 步,直到 low=high;
快速排序的演示
时间复杂度
- 最优时间复杂度:O(nlogn)
- 最坏时间复杂度:O(n2)
- 稳定性:不稳定
从一开始快速排序平均需要花费O(n log n)时间的描述并不明显。但是不难观察到的是分区运算,数组的元素都会在每次循环中走访过一次,使用O(n)的时间。在使用结合(concatenation)的版本中,这项运算也是O(n)。
在最好的情况,每次我们运行一次分区,我们会把一个数列分为两个几近相等的片段。这个意思就是每次递归调用处理一半大小的数列。因此,在到达大小为一的数列前,我们只要作log n次嵌套的调用。这个意思就是调用树的深度是O(log n)。但是在同一层次结构的两个程序调用中,不会处理到原来数列的相同部分;因此,程序调用的每一层次结构总共全部仅需要O(n)的时间(每个调用有某些共同的额外耗费,但是因为在每一层次结构仅仅只有O(n)个调用,这些被归纳在O(n)系数中)。结果是这个算法仅需使用O(n log n)时间。
代码实现
def quick_sort(alist, start, end):
"""快速排序"""
# 递归的退出条件
if start >= end:
return
# 设定起始元素为要寻找位置的基准元素
mid_value = alist[start]
# low 为序列左边的由左向右移动的游标
low = start
# high 为序列右边的由右向左移动的游标
high = end
while low < high:
# 如果 low 与 high 未重合,high 指向的元素不比基准元素小,则 high 向左移动
while low < high and alist[high] >= mid_value:
high -= 1
# 将 high 指向的元素放到 low 的位置上
alist[low] = alist[high]
# 如果 low 与 high 未重合,low 指向的元素比基准元素小,则 low 向右移动
while low < high and alist[low] < mid_value:
low += 1
# 将 low 指向的元素放到 high 的位置上
alist[high] = alist[low]
# 退出循环后,low 与 high 重合,此时所指位置为基准元素的正确位置
# 将基准元素放到该位置
alist[low] = mid_value
# 对基准元素左边的子序列进行快速排序
quick_sort(alist, start, low-1)
# 对基准元素右边的子序列进行快速排序
quick_sort(alist, low+1, end)
if __name__ == '__main__':
li = [13,14,94,33,82,25,59,94,65,23,45,27,73,25,39,10]
print(li)
quick_sort(li,0,len(li)-1)
print(li)
结果:
[13, 14, 94, 33, 82, 25, 59, 94, 65, 23, 45, 27, 73, 25, 39, 10]
[10, 13, 14, 23, 25, 25, 27, 33, 39, 45, 59, 65, 73, 82, 94, 94]
以上是关于数据结构与算法笔记—— 快速排序的主要内容,如果未能解决你的问题,请参考以下文章
python 学习笔记 -- 数据结构与算法 快速排序 Quick Sort