算法-快速排序-python3实现

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())

猜你喜欢

转载自blog.csdn.net/qq_17753903/article/details/82765619