algoalgo-world
algoalgo-world/sort/quick-sort
sort/quick-sort

快速排序

最好
O(n log n)
平均
O(n log n)
最坏
O(n^2)
空间
O(log n)
稳定性
不稳定
方式
比较

选一种语言就能看到代码

def quick_sort(a, lo=0, hi=None):
    if hi is None:
        hi = len(a) - 1
    if lo >= hi:
        return
    pivot = a[hi]
    cut = lo
    for i in range(lo, hi):
        if a[i] < pivot:
            a[i], a[cut] = a[cut], a[i]
            cut += 1
    a[cut], a[hi] = a[hi], a[cut]
    quick_sort(a, lo, cut - 1)
    quick_sort(a, cut + 1, hi)
function quickSort(a, lo = 0, hi = a.length - 1) {
  if (lo >= hi) return;
  const pivot = a[hi];
  let cut = lo;
  for (let i = lo; i < hi; i++) {
    if (a[i] < pivot) {
      [a[i], a[cut]] = [a[cut], a[i]];
      cut++;
    }
  }
  [a[cut], a[hi]] = [a[hi], a[cut]];
  quickSort(a, lo, cut - 1);
  quickSort(a, cut + 1, hi);
}
static void swap(int a[], int i, int j) {
    int t = a[i];
    a[i] = a[j];
    a[j] = t;
}

void quick_sort(int a[], int lo, int hi) {
    if (lo >= hi) return;
    int pivot = a[hi];
    int cut = lo;
    for (int i = lo; i < hi; i++) {
        if (a[i] < pivot) swap(a, i, cut++);
    }
    swap(a, cut, hi);
    quick_sort(a, lo, cut - 1);
    quick_sort(a, cut + 1, hi);
}
void quick_sort(std::vector<int>& a, int lo, int hi) {
    if (lo >= hi) return;
    int pivot = a[hi];
    int cut = lo;
    for (int i = lo; i < hi; i++) {
        if (a[i] < pivot) std::swap(a[i], a[cut++]);
    }
    std::swap(a[cut], a[hi]);
    quick_sort(a, lo, cut - 1);
    quick_sort(a, cut + 1, hi);
}
static void QuickSort(int[] a, int lo, int hi) {
    if (lo >= hi) return;
    int pivot = a[hi];
    int cut = lo;
    for (int i = lo; i < hi; i++) {
        if (a[i] < pivot) {
            (a[i], a[cut]) = (a[cut], a[i]);
            cut++;
        }
    }
    (a[cut], a[hi]) = (a[hi], a[cut]);
    QuickSort(a, lo, cut - 1);
    QuickSort(a, cut + 1, hi);
}
static void swap(int[] a, int i, int j) {
    int t = a[i];
    a[i] = a[j];
    a[j] = t;
}

static void quickSort(int[] a, int lo, int hi) {
    if (lo >= hi) return;
    int pivot = a[hi];
    int cut = lo;
    for (int i = lo; i < hi; i++) {
        if (a[i] < pivot) swap(a, i, cut++);
    }
    swap(a, cut, hi);
    quickSort(a, lo, cut - 1);
    quickSort(a, cut + 1, hi);
}
先跑一遍,再读源码