定义

快速排序(英语:Quicksort),又称分区交换排序(partition-exchange sort),简称快排,一种排序算法

算法步骤

  1. 挑选基准值:从数列中挑出一个元素,称为“基准”(pivot),
  2. 分割:重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(与基准值相等的数可以到任何一边)。在这个分割结束之后,对基准值的排序就已经完成,
  3. 递归排序子序列:递归地将小于基准值元素的子序列和大于基准值元素的子序列排序。

排序过程

Sorting_quicksort_anim.gif

复杂度

平均时间复杂度 nlogn.svg
最坏时间复杂度 sitan2.svg
最优时间复杂度 nlogn.svg
空间复杂度 根据实现的方式不同而不同
最佳解 有时是
排序方式 in-place
稳定性 不稳定

Java代码

  1. public class QuickSort {
  2. public static void main(String[] args) {
  3. int[] arr = {65461, 34, 868, 4, 5, 2, 3, 99, 5345,3, 34, 2,6564, 434};
  4. System.out.println(Arrays.toString(arr));
  5. new QuickSort().quickSort(arr,0,arr.length-1);
  6. System.out.println(Arrays.toString(arr));
  7. }
  8. public void quickSort(int[] arr,int left,int right) {
  9. // 递归边界
  10. if (left < right) {
  11. // 挑选基准值索引,已就位元素
  12. int pivotIndex = partition(arr, left, right);
  13. // 分割 递归排序子序列
  14. quickSort(arr,left,pivotIndex-1);
  15. quickSort(arr,pivotIndex+1,right);
  16. }
  17. }
  18. private int partition(int[] arr, int left, int right) {
  19. // 基准点
  20. int pivotValue = arr[left];
  21. while (left < right) {
  22. // 大于等于基准值的都位于其右边 等于的位于那边都可以
  23. while (left < right && pivotValue <= arr[right]) {
  24. right--;
  25. }
  26. if (left < right) {
  27. arr[left] = arr[right];
  28. }
  29. // 小于等于基准值的都位于其右边
  30. while (left < right && arr[left] <= pivotValue) {
  31. left++;
  32. }
  33. if (left < right) {
  34. arr[right] = arr[left];
  35. }
  36. }
  37. // 基准值就位
  38. arr[left] = pivotValue;
  39. // 返回基准值索引
  40. return left;
  41. }
  42. }