快速排序算法是一种高效的排序算法,由C. A. R. Hoare在1960年提出。它采用了分而治之的策略,将一个大问题分解为多个较小的问题来解决。在排序过程中,快速排序算法选择一个“基准”元素,然后将数组分为两部分:一部分包含所有小于基准的元素,另一部分包含所有大于基准的元素。这一过程称为“划分”。之后,算法递归地对这两部分继续进行快速排序。下面是快速排序的基本步骤和伪代码描述:
基本步骤:
- 选择基准:从数组中选择一个元素作为“基准”(pivot)。可以选择第一个元素、最后一个元素或随机选择一个元素。
- 分区:重新排列数组,所有小于基准的元素摆放在基准前面,所有大于基准的元素摆在基准后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数组的中间位置。这个称为分区(partition)操作。
- 递归排序:递归地(recursive)将小于基准值元素的子数组和大于基准值元素的子数组排序。
伪代码:
function quicksort(arr, low, high)
if low < high then
pivotIndex <- partition(arr, low, high)
quicksort(arr, low, pivotIndex - 1) // 对低子数组进行快速排序
quicksort(arr, pivotIndex + 1, high) // 对高子数组进行快速排序
end if
end function
function partition(arr, low, high)
pivot <- arr[high]
i <- low - 1
for j <- low to high-1
if arr[j] <= pivot then
i <- i + 1
swap arr[i] with arr[j]
end if
end for
swap arr[i+1] with arr[high]
return i + 1
end function
在实际应用中,快速排序的性能非常好,平均时间复杂度为O(n log n),但是在最坏情况下(例如数组已经是有序的或逆序的)时间复杂度会退化到O(n^2)。为了优化,通常会采用随机选择基准或“三数取中”等策略来避免最坏情况的发生。此外,快速排序是一种原地排序算法,除了递归调用栈外,不需要额外的存储空间,空间复杂度为O(log n)。