快速排序

双指针实现,选定一个基准值,分别对基准值左右两个子序列进行递归操作,使其变得有序(即比基准值大的放右边,比基准值小的放左边),重要的是基准值,算法快慢取决于基准值的位置。

快速排序 - 图1

如何选取基准值


  1. 选第一个或者最后一个

这种选取对于随机数组来说没问题,但是对于有序数组,此时为最坏情况,时间复杂度为O(n2)

  1. public static void subSort(int[] arr, int start, int end) {
  2. if (start < end) {
  3. int low = start;
  4. int high = end;
  5. int base = arr[start]; // 基准值,取左边第一个
  6. while (low < high) {
  7. while (low < high && arr[high] >= base) {
  8. high--;
  9. }
  10. arr[low] = arr[high]; // 当arr[high]小于基准值,就要赋值给arr[left]
  11. while (low < high && arr[low] <= base) {
  12. low++;
  13. }
  14. arr[high] = arr[low]; // 当arr[low]大于基准值,就要赋值给arr[high]
  15. }
  16. arr[low] = base; // 此时low = high,用基准值来填这个坑
  17. subSort(arr, start, low - 1);
  18. subSort(arr, low + 1, end);
  19. }
  20. }

  1. 随机生成基准值

  2. 三数取中法

快速排序最好情况的时间复杂度为O(nlog2n)