跳转至

十大经典排序算法(Java 实现)

一、速查表

算法 平均 最坏 最好 空间 稳定
冒泡 O(n²) O(n²) O(n) O(1)
选择 O(n²) O(n²) O(n²) O(1)
插入 O(n²) O(n²) O(n) O(1)
希尔 O(n^1.3) O(1)
快排 O(n log n) O(n²) O(n log n) O(log n)
归并 O(n log n) O(n log n) O(n log n) O(n)
堆排 O(n log n) O(n log n) O(n log n) O(1)
计数 O(n+k) O(n+k) O(n+k) O(k)
桶排 O(n+k) O(n²) O(n) O(n+k)
基数 O(d(n+k)) O(d(n+k)) O(d(n+k)) O(n+k)

二、快速排序

void quickSort(int[] a, int lo, int hi) {
    if (lo >= hi) return;
    int pivot = partition(a, lo, hi);
    quickSort(a, lo, pivot - 1);
    quickSort(a, pivot + 1, hi);
}

int partition(int[] a, int lo, int hi) {
    int p = a[lo];
    int i = lo, j = hi;
    while (i < j) {
        while (i < j && a[j] >= p) j--;
        while (i < j && a[i] <= p) i++;
        swap(a, i, j);
    }
    swap(a, lo, i);
    return i;
}

优化:随机选 pivot、小数组用插入排序。

三、归并排序

void mergeSort(int[] a, int lo, int hi, int[] tmp) {
    if (lo >= hi) return;
    int mid = (lo + hi) >>> 1;
    mergeSort(a, lo, mid, tmp);
    mergeSort(a, mid + 1, hi, tmp);
    merge(a, lo, mid, hi, tmp);
}

稳定,外部排序常用。

四、堆排序

建大顶堆,堆顶与末尾交换,调整堆。

  • 原地排序,不稳定。
  • 适合 TopK。

五、Java 内置排序

  • Arrays.sort(int[]):基本类型用双轴快排
  • Arrays.sort(Object[]):对象用 TimSort(归并 + 插入)。
  • Collections.sort:同上。

面试加分

  • 什么是稳定?相等元素排序后相对顺序不变。
  • 为什么快排平均最快?常数小、缓存友好。