快速排序算法是对冒泡排序的一种改进。它的基本思想是将需要排序的数据,以一个基准数,分成独立的两个部分。再把这两个部分,分别看做是需要排序的数据,再以各自的基准数,分成独立的两个部分,如此往复,直到数据无法继续分成两个部分,如下:
示例:将列表 [7, 4, 2, 17, 14, 8, 9, 10, 12, 16, 6]中的元素按从小到大
第一步.将列表的第一个元素索引赋值给变量low,最后一个元素索引赋值给变量high,以列表第一个元素为基准,将第一个元素赋值给变量x。如果列表high索引处的值比x大则将high减一,直到列表high索引处的值小于或等于x的值,就将列表索引high处的值赋值给变量low。
第二步,如果列表索引low处的值小于或等于x的值,就将low加一,直到列表high索引处的值大于x,就将列表索引low处的值赋值给列表索引high。
第三步、循环执行第一步、第二步,直到 low等于high,将x的值赋值给列表索引low处。并将low视为基准位置
第四步、以low为基准位置,将列表分成两个子列表即 [6 , 4 , 2] 和 [14, 8 , 9, 10, 12, 16, 17],将两个子列表分别执行第一步、第二步、第三步、第四步,直达无法再形成新的子列表
# 快速排序python代码实现
def sub_sort(l, low, high):
x = l[low] #基准
while low < high:
#如果后边的数比x大,high往前走,直到比x小
while l[high] > x and low < high:
high -= 1
#如果后边的数比x小或相等,则将数赋值给l[low]
l[low] = l[high]
#如果前边的数比x小,则low往后走,直到比x大
while l[low] < x and low < high:
l[low] += 1
#如果前边的数比x大,则将值赋值给l[high]
l[high] = l[low]
#将x插入最终位置
l[low] = high
#每一轮最终基准数确定的位置
return low
def quick(l:list, low:int, high:int):
if low < high:
key = sub_sort(l, low, high)
quick(l, low, key-1)
quick(l, key+1, high)