快速排序
基本思想
- 假设 数组 为 3 4 5 2 1
- 第一步 首先将数组分为两部分,假设选择一个值为 3
- 第二步 那么数组将会分为 2 1 和 4 5 两部分,数组 3 位于中间,不需要再做变化
- 第三步 递归 处理 数组 2 1,进入递归第二步,2 和 1 的位置将会进行变化
- 第四步 跳出递归,如果数组的开头 和 结尾一样大,表示这个数组已经为空,或者数组已经不需要再变化了
重点是如何处理第二步
- 设置两个指针,low 和 high
- low 从小到大,遍历数组
- high 从大到小,遍历数组
- 如果碰到一个数 大于 一开始选择的中间值,那么就将两个数据进行调换
- 如果,从大到小,从小到大,遍历完成了,已经没有值需要进行调换了,那么结束这一部分的处理
第三步调用函数名一样的函数,将分割好的起点和终点,作为参数传入
- 将数组A `3 4 5 2 1` 分为 ` 2 1` 和 `4 5`,分成子问题进行递归处理
def quick_sort2(arr, start, end):
if start >= end:
return arr
low = start
high = end
p_value = arr[start]
while low < high:
while low < high and arr[high] >= p_value:
high -= 1
arr[low] = arr[high]
while low < high and arr[low] <= p_value:
low += 1
arr[high] = arr[low]
arr[high] = p_value
quick_sort2(arr, start, low)
quick_sort2(arr, high+1, end)
return arr
a = [22, 24, 8, 19, 11, 11, 13, 16, 19, 15, 14, 28, 12, 17, 18, 2, 17, 17]
b2 = copy.copy(a)
print(quick_sort2(a, 0, len(a) - 1))
a1 = sorted(b2)
if a1 == a:
print("Yes, ", b2)
else:
print("No ", a1)