Python 快排:
概念
拿到一组数,取一个中间数,把剩下的数分别放到该中间数的左边和右边,然后再用此方法对左右两组数字进行操作
以下面的数组举例:
取第一个数为中间数
设置两个游标,一个从左往右遍历,一个从右往左遍历,比中间值大的放到左边,比中间值小的放到右边,与中间值相等的位置不变,直到两个游标指向同一个数字为止,然后把取出的中间数放到游标所指的位置
因为当前左侧游标指的是已经取出的中间值,所以先从右侧游标开始遍历,如果遇到比32小的,放到左侧游标所指位置
下图可以看到,遍历到15的时候发现比中间值小,所以放到左侧游标位置,下一步左侧游标开始向右移动
移动到64的时候发现比中间值大,所以放到右侧游标位置,下一步右侧游标开始向左移动
以此类推,
最后走到78的位置的时候游标重合,下一步把中间值放到游标位置
可以看到,游标把数组分成了两部分,下面开始对游标左侧和右侧的数字进行相同的操作
先对左侧的数字进行比较,取出中间值15,右侧游标向左移动
游标重合,再把15放到重合处,然后对右侧数组做相同操作,我就不画了,下面代码实现
代码实现
# arr为比较的数组,first为左侧游标所指位置,last为右侧游标所指位置
def quicker_sort(arr, first, last):
# 循环退出条件为连个游标指向同一位置(可以先跳过此行代码,先看下面的,到最后再看这行)
if first >= last:return None
mid_value = arr[first] # 先确定中间值
low = first # 左侧游标
high = last # 右侧游标
# 下面进入循环体,循环条件为左侧游标如果不小于右侧游标
while low < high:
# 进入右侧游标遍历,如果右侧游标所指的位置大于等于中间值,右侧游标向左移动一个位置
while low < high and arr[high] >= mid_value:
high -= 1
arr[low] = arr[high] # 如果小于中间值,那么就放到左侧游标所指位置
while low < high and arr[low] <= mid_value: # 左侧游标再向右移动
low += 1
arr[high] = arr[low] # 如果大于中间值,则放到右侧游标所指位置
# 左侧游标不小于右侧游标时,说明两个游标指向了一个位置,所以把中间值放到整个位置
arr[low] = mid_value
# 现在中间值分割了左侧数组和右侧数组,下面用递归来对两侧数组进行相同操作
quicker_sort(arr, first, low-1)
quicker_sort(arr, low+1, last)
if __name__ == '__main__':
arr = [23, 4, 1, 31, 53, 25, 0, -2, 132.2, 131.1]
quicker_sort(arr, 0, len(arr)-1)
print(arr)
到这就结束了,如果有写的不好不明白的地方,希望各位大佬可以多多指正
小声BB:毕竟我也是一个小菜鸡😁