1、定义
理解:
- 首先将第一个元素找出来,然后设置low、high两个游标,分别从两边开始向第一个元素靠近;
- 假设首先移动low游标,如果游标指向的元素比当前元素小,继续向右移动,如果游标指向的元素比当前元素大,则停止,开始移动high游标;
- 开始移动high游标,比较游标指向的元素和当前元素的大小,如果比当前元素大,则继续向左移动游标,如果比当前元素小,则停止,交换low游标所指的元素和high游标所指的元素;
- 再移动low游标,如此反复,直到low游标和high游标重合,则第一个元素的位置就找到了;
- 这时第一个元素左侧的都比它小,右侧的都比它大;
- 接下来在这个元素的左侧和右侧继续相同的操作,直到将所有元素排列好。
2、python实现
def quick_sort(alist,first,last):
"""引入两个起始值和结束值参数,
因为进行递归操作时,都是在同一个列表中进行,
每次进行一次新的递归时需要一个新的操作部分的起始和结束
"""
# 当序列中只有一个元素时,不做操作
if first >= last:
return
#n=len(alist)
# 设定第一个元素为中间值
# mid_value=alist[0]
mid_value=alist[first]
# low为从左边开始的索引,high为从右边开始的索引
low=first
high=last
# 当指定一个中间值,判断左边都小于它,和右边都大于它时,需要满足的一个大条件
while low<high:
# 先从右边开始判断
while low<high and alist[high]>=mid_value:
# 当满足大条件且右边元素大于中间值时,high游标向左移动一位
high -= 1
# 否则,将右边的小于中间值的值移到左边
alist[low]=alist[high]
# 这时high指向的位置为空,所以移动左边
while low<high and alist[low] <= mid_value:
# 当满足大条件且low游标所指的元素小于等于中间值时,游标继续向右移动一步
low += 1
# 否则,将左边大于中间值的元素移到右边刚刚移走元素的位置
alist[high]=alist[low]
# 从循环退出时,low=high
alist[low]=mid_value
# 使用递归,同样的算法在中间值左右两部分列表中实现
# 对low左边的列表执行快排
#quick_sort(alist[:low-1])
quick_sort(alist,first,low-1)
# 对low右边的列表执行快排
# quick_sort(alist[low+1:])
quick_sort(alist,low+1,last)
if __name__ == '__main__':
list=[11,43,2,4,55,78,45,97,56,73,38]
print(list)
quick_sort(list,0,len(list)-1)
print(list)
结果:
[11, 43, 2, 4, 55, 78, 45, 97, 56, 73, 38]
[2, 4, 11, 38, 43, 45, 55, 56, 73, 78, 97]
3、时间复杂度
- 最优时间复杂度:O(nlogn)
- 最坏时间复杂度:O(n2)
- 稳定性:不稳定