快速排序
快速排序的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分:分割点左边都是比它小的数,右边都是比它大的数。然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。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)