快速排序是一种分治算法,它将一个大的数组分成两个较小的子数组:一个子数组的所有元素都小于另一个子数组的所有元素。然后分别对这两个子数组递归地执行快速排序,直到子数组中只有一个元素为止。最后将所有子数组合并以得到排序后的数组。
代码示例如下:
def partition(array, left, right):
# 以 array[left] 作为基准值
tmp = array[left]
while left < right:
# 如果右边界的值大于基准值则更新右边界
while left < right and array[right] >= tmp:
right -= 1
# 将基准值右侧小于基准值的元素移动到左侧
array[left] = array[right]
# 如果左边界的值小于基准值则更新左边界
while left < right and array[left] <= tmp:
left += 1
# 将基准值左侧大于基准值的元素移动到右侧
array[right] = array[left]
# 将基准值放到数组中正确的位置
array[left] = tmp
return left
def quick_sort(array):
quick(array, 0, len(array) - 1)
def quick(array, start, end):
if start >= end:
return
pivot = partition(array, start, end)
# 对左子数组排序
quick(array, start, pivot - 1)
# 对右子数组排序
quick(array, pivot + 1, end)
array = [3, 6, 8, 10, 1, 2, 1]
quick_sort(array)
print("Sorted array:", array)
具体来说,以上代码实现了如下两个函数:
partition(array, left, right)
:以array[left]
作为基准值来将数组分为两部分,左侧部分的各个元素都小于等于基准值,右侧部分的元素都大于等于基准值。
quick(array, start, end)
:递归执行快速排序,将数组分成左右两个子数组,并对这两个子数组递归调用quick
函数来排序。
quick_sort
函数只是一个外部接口,它调用quick
函数来进行实际的排序,同时也提供了起始索引和结束索引这两个参数来指定要排序的数组的范围。
在partition
函数中,代码使用双指针法来实现分区。首先,将array[left]
作为基准值tmp
。然后,用右指针(right
)来搜索小于tmp
的元素,搜索到第一个这样的元素时将其移动到左侧,此时右指针移动到左指针(left
)的位置。接着用左指针搜索大于tmp
的元素,搜索到第一个这样的元素时将其移动到右侧,此时左指针移动到右指针的位置。重复执行这个过程直到左右指针重合,此时数组中间的位置即为基准值正确的位置。最后将基准值放到数组中的正确位置,并返回该位置作为划分的分界点。
在quick
函数中,首先调用partition
函数来分区,得到基准值的位置。然后分别对左侧和右侧的子数组递归调用quick
函数,直到子数组只包含一个元素为止。
因为快速排序是一种原址排序(in-place sorting)算法,它只需要常数级别的额外空间,并且它的时间复杂度是 O ( n l o g n ) O(nlogn) O(nlogn)( n n n为要排序的元素个数)。