快速排序

快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分:分割点左边都是比它小的数,右边都是比它大的数。然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。partition算法的时间复杂度是O(n),一共进行logn次递归,所以时间复杂度是nlogn。

快速排序

上图中,演示了快速排序的处理过程:

初始状态为一组无序的数组:2、4、5、1、3。

经过以上操作步骤后,完成了第一次的排序,得到新的数组:1、2、5、4、3。

新的数组中,以2为分割点,左边都是比2小的数,右边都是比2大的数。

因为2已经在数组中找到了合适的位置,所以不用再动。

2左边的数组只有一个元素1,所以显然不用再排序,位置也被确定。(注:这种情况时,left指针和right指针显然是重合的。因此在代码中,我们可以通过设置判定条件left必须小于right,如果不满足,则不用排序了)。

而对于2右边的数组5、4、3,设置left指向5,right指向3,开始继续重复图中的一、二、三、四步骤,对新的数组进行排序。

def quicksort(input_list):
    if len(input_list) == 0:
        return []
    length = len(input_list)
    start = 0
    end = length - 1
    partition(input_list, start, end)
    return input_list

def partition(input_list, start, end):
    if end <= start:
        return start
    base = input_list[start]
    index1, index2 = start, end
    while start < end:
        while start < end and input_list[end] >= base:
            end -= 1
        input_list[start] = input_list[end]
        while start < end and input_list[start] <= base:
            start += 1
        input_list[end] = input_list[start]
    input_list[start] = base
    partition(input_list, index1, start-1)
    partition(input_list, start+1, index2)

if __name__ == '__main__':
    input_list = [6, 4, 8, 9, 2, 3, 1]
    print('排序前:', input_list)
    quicksort(input_list)
    print('排序后:', input_list)