Java 冒泡排序与选择排序原理及代码实现
掌握基础排序算法是理解计算机科学与优化程序性能的关键环节。本文将详细解析 Java 中的经典排序算法——冒泡排序与选择排序,涵盖其工作原理、逻辑步骤及完整代码示例。
冒泡排序(Bubble Sort)
基本思想: 冒泡排序通过重复遍历待排序的列表,比较相邻的两个元素,如果它们的顺序错误就进行交换。每一轮遍历都会将当前未排序部分的最大值“浮”到序列的末尾,就像水泡从水底升起一样。
第1步:遍历与比较
- 操作入口: 第一层循环控制总的遍历趟数,第二层循环负责执行具体的比较。
- 动作说明: 从第一个元素开始,依次比较
a[j]和a[j+1]。若前者大于后者,则交换位置。 - 关键参数: 内层循环的边界通常设为
a.length - i - 1,因为每趟结束后,最后i个元素已经是排好序的,无需再参与比较。
以下是标准的 Java 冒泡排序实现代码:
public class Paixu {
public static void main(String[] args) {
int[] a = {2, 6, 4, 5, 1, 7, 3};
// 外层循环控制需要遍历的趟数
for (int i = 0; i < a.length - 1; i++) {
// 内层循环执行相邻元素的比较与交换
for (int j = 0; j < a.length - i - 1; j++) {
if (a[j] > a[j + 1]) {
// 交换位置
int n = a[j];
a[j] = a[j + 1];
a[j + 1] = n;
}
}
}
// 输出结果验证
for (int val : a) {
System.out.println(val);
}
}
}
如上图所示
,数据在内存中的流转过程体现了这种逐步逼近正确顺序的逻辑。
选择排序(Selection Sort)
基本思想: 每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。
第1步:寻找极值并交换
- 操作入口: 同样使用两层嵌套循环,但目的与冒泡不同。
- 动作说明: 假设当前位置
i是最小值的位置,然后遍历剩余元素(从i+1到末尾)。一旦发现比当前假设的最小值更小的元素,就更新“最小值索引”。 - 重要参数: 只有在确认了本轮真正最小的元素之后,才进行一次交换操作。这减少了频繁交换带来的开销。
选择排序的代码实现逻辑如下:
public class SelectSortDemo {
public static void main(String[] args) {
int[] arr = {34, 56, 3, 234, 767, 89, 0, 324, 1, 32, 54, 89, 8};
// 外层循环控制选定位置的迭代次数
for (int i = 0; i < arr.length - 1; i++) {
int minIndex = i; // 默认当前位置为最小值索引
// 内层循环寻找后续元素中的真正的最小值
for (int j = i + 1; j < arr.length; j++) {
if (arr[minIndex] > arr[j]) {
minIndex = j; // 更新更小的元素索引
}
}
// 如果找到的最小值不是当前 i 位置的元素,则进行交换
if (minIndex != i) {
int temp = arr[minIndex];
arr[minIndex] = arr[i];
arr[i] = temp;
}
}
}
}
对比上面展示的冒泡排序版本(即 Paixu 类中的第二个变体),标准的选择排序实现通常先记录索引再统一交换,这在处理大数组时效率更高一些。而某些简化的“选择”写法虽然也属于广义的选择逻辑,但在严格定义上略有差异。
总结与应用场景
虽然这两种算法的时间复杂度均为 O(n²),在实际生产环境中处理大规模数据时不如快速排序高效,但它们结构清晰、易于理解,是学习计算机算法入门的绝佳案例。对于小型数据集或需要保持特定交换稳定性的场景,它们依然具有参考价值。
以上就是 Java 冒泡排序和选择排序的详细代码解析与实现,更多关于 Java 算法优化的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













