0.摘要
本文主要介绍快速排序原理,并用python3进行实现。
1.原理
我们通过一个具体数组排序,进行讲解:
我们取一个数组array = [10 15 2 45 34 16 46 67 93 83]
step1:先将最左侧或最右侧的值选定为参考值。
本文选取左侧值为参考值,并将参考值存放到key中,即key = array[0]。
由于array[0]的值已经复制到了key中,所以array[0]的位置相当于空了出来,可以随意被覆盖。
step2:从数组的最右侧开始遍历,找到一个小于或等于key的数就停止,即find array[i] <= key。
发现array[end]就符合条件,于是停止寻找,并将该位置记为right,转到step3
step3:将上一步找到的数放在左侧空位中。
由于array[end]的值已经复制到了array[0]处,所以array[end]的位置相当于空了出来,可以随意被覆盖。
并将该位置记为left。
step4:从数组的left处开始遍历,找到一个大于key的数就停止,即find array[i] > key。
step5:从数组的right开始遍历,找到一个小于或等于key的数就停止,即find array[i] <= key。
并将该位置记为right。
step6:从数组的left处开始遍历,找到一个大于key的数就停止,即find array[i] > key。
step7:这时候,right,left相遇。我们发现:
黄色框(left)左边的值都比key小;
蓝色框(right)右边的值都比key大;
将key插入到left中,得到:
step8:那么按照step1-7的方法,继续划分:
66左边的数组,可以划分成两组:1.比60小的一组,2.比60大的一组
66右边的数组,也可以划分成两组:1.比84小的一组,2.比85大的一组
step9:经过不断重复step1-7的方法,当子数组元素数<=3的时候,数组即排序完成。
将个子数组组合起来,便得到了有序的数组。
2.python实现
import numpy as np
def quick_sort(array, left, right):
if left >= right:
return
low = left
high = right
key = array[low]
while left < right:
while left < right and array[right] > key:
right -= 1
array[left] = array[right]
# print('right',array)
while left < right and array[left] <= key:
left += 1
array[right] = array[left]
# print('left',array)
array[right] = key
quick_sort(array, low, left - 1)
quick_sort(array, left + 1, high)
if __name__ == "__main__":
for _ in range(1):
arr = np.random.randint(0,100,size=[10])
# print(arr)
sorted_arr = np.sort(arr)
quick_sort(arr,0,np.size(arr)-1)
assert( sorted_arr.all() == arr.all())