快速排序
快速排序(Quick sort),又称划分交叉排序,通过一趟排序将要排序的数据分割成独立的两部分。其中一部分所有的数据都要比另一部分所有的数据小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
步骤
- 从数列中挑出一个元素,称为“基准”。
- 重新排序数列,所有元素比基准小的在元素左边,比基准大的在右边。该基准就处于数列中间位置,这个称为分区操作。
- 递归地把小于基准值的元素和大于基准的元素排序。
代码实现
# -*- coding: utf-8 -*-
def quick_sort(array):
"""快速排序"""
if len(array) >= 2:
mid = array[len(array)//2] # 选取基准值,也可选取第一个或者最后一个
array.remove(mid)
left_arr = [] # 基准值左侧的列表
right_arr = [] # 基准值右侧的列表
for item in array:
if item < mid:
left_arr.append(item)
else:
right_arr.append(item)
return quick_sort(left_arr) + [mid] + quick_sort(right_arr)
else:
return array
if __name__ == '__main__':
arr = [99,55,77,33,11,22]
print(arr) # [99,55,77,33,11,22]
print(quick_sort(arr)) # 输出为:[11, 22, 33, 55, 77, 99]
上面介绍快速排序算法的写法相对来说比较好理解, 该算法返回一个新的列表,下面介绍另一种写法,该写法从始至终至终都在列表自身进行操作。
# -*- coding: utf-8 -*-
def quick_sort_2(array, first, last):
"""快速排序"""
if first >= last:
return
mid = array[first]
low = first
high = last
while low < high:
while low < high and array[high] >= mid:
high -= 1
array[low] = array[high]
while low < high and array[low] < mid:
low += 1
array[high] = array[low]
# 循环退出时,low==high
array[low] = mid
# 对low左边列表执行快速排序
quick_sort_2(array, first, low-1)
# 对low右边列表执行快速排序
quick_sort_2(array, low+1, last)
if __name__ == '__main__':
arr = [99,55,77,33,11,22]
print(arr) # [99,55,77,33,11,22]
quick_sort_2(arr, 0, len(arr)-1)
print(arr) # [11, 22, 33, 55, 77, 99]
时间复杂度
- 最优时间复杂度:O(nlogn)
- 最坏时间复杂度:O(n^2)
- 稳定性:不稳定