欢迎光临
我们一直在努力

Java 经典排序算法六件套:从冒泡到堆排,一次彻底搞懂

Java 经典排序算法六件套:从冒泡到堆排,一次彻底搞懂

面试官让你手写排序?稳住,看完这一篇就上岸了

引言

排序算法是程序员的基本功,也是面试的\”硬通货\”——大厂校招笔试几乎必考,现场手写快排、归并、堆排更是家常便饭。

网上讲排序的文章多如牛毛,但大多停留在\”翻译课本\”层面:列定义、贴代码、说复杂度,看完你还是不会用、不会选、不会变形。

这篇文章不一样。我用 6 个核心算法 × 5 个固定板块(核心思想 → 代码实现 → 关键细节 → 适用场景 → 面试变形)的统一结构,把每种排序讲透。每段代码都经过实测,每个细节都是面试高频坑,每个变形都是大厂真题改编。

读完这一篇,你能做到的:

  • 6 种排序闭着眼睛都能手写
  • 知道每种排序的\”最佳战场\”和\”绝对禁区\”
  • 面对排序变形题(比如 TopK、第 k 大)有清晰的思路模板

1. 冒泡排序:最简单的排序,没有之一

面试官让手写排序?掏出冒泡,至少能及格

核心思想

  • 从头到尾依次比较相邻两个元素
  • 如果前面比后面大,就交换(大的往后\”冒\”)
  • 每一趟结束后,最大的元素沉到了最后
  • 重复以上过程,每趟少比较一个(最后已有序)

优化点:如果某趟一次都没交换,说明数组已经有序——立即终止,这就是最好情况 O(n) 的来源。

复杂度:最坏 O(n²) / 最好 O(n) / 平均 O(n²)

Java 实现

public class BubbleSort {


public static void bubbleSort(int[] arr) {


int n = arr.length;
for (int i = 0; i < n 1; i++) {


boolean swapped = false;
for (int j = 0; j < n 1 i; j++) {


if (arr[j] > arr[j + 1]) {


int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = true;
}
}
if (!swapped) break;
}
}
}

三个关键细节

  • 外层循环 i < n – 1,不是 i < n——n 个元素排好 n-1 个
  • 内层循环 j < n – 1 – i,减 i 是关键(末尾已有序)
  • swapped 标志必须有——O(n²) 变 O(n) 的唯一机会

适用场景

  • 适用:数据量极小(< 100)/ 基本有序 / 教学演示
  • 不适用:大数据量 / 生产环境

面试变形

  • 鸡尾酒排序(双向冒泡):从左到右冒大,从右到左冒小
  • 奇偶排序:奇数位和偶数位分别比较,适合并行
  • 冒泡第 k 大:只跑 k 趟冒泡

2. 选择排序:最简单粗暴的\”找最小\”

每一轮都挑最矮的站前面——像极了军训排队

核心思想

  • 从位置 i 开始,扫描 i 到末尾所有元素
  • 找到最小元素的下标 minIndex
  • 把 arr[i] 和 arr[minIndex] 交换
  • i++,重复直到末尾

每轮只交换一次(比冒泡交换次数少),但比较次数不变。

复杂度:最好/最坏/平均 O(n²)。原地排序,不稳定。

Java 实现

public class SelectionSort {


public static void selectionSort(int[] arr) {


int n = arr.length;
for (int i = 0; i < n 1; i++) {


int minIndex = i;

赞(0)
未经允许不得转载:171主机测评 » Java 经典排序算法六件套:从冒泡到堆排,一次彻底搞懂
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址