在排序算法的大家族中,冒泡排序是最基础也最经典的算法之一。它的核心思想简单易懂,通过重复地走访待排序序列,一次比较两个相邻的元素,若它们的顺序错误就把它们交换过来,直到没有需要交换的元素为止。虽然冒泡排序的时间复杂度较高,在大规模数据排序中并不常用,但它是理解排序算法思想的绝佳入门案例,也是计算机考研 408 和算法学习中的基础内容。
冒泡排序(Bubble Sort)之所以被称为 “冒泡”,是因为在排序过程中,较小的元素会像水中的气泡一样逐渐 “上浮” 到序列的顶端,而较大的元素则会 “下沉” 到序列的末端。
例如,对于一个无序序列 [5, 2, 9, 1, 5, 6],使用冒泡排序进行排序时,过程如下:
冒泡排序的核心思想是通过相邻元素的比较和交换,使较大的元素逐渐 “下沉” 到序列的末端。其基本思路遵循以下步骤:
冒泡排序的关键在于 “逐轮下沉最大元素”,每一轮排序都会确定一个元素的最终位置。对于长度为n的序列,最多需要进行n-1轮排序(在最坏情况下,即序列完全逆序时)。
使用冒泡排序解决实际问题时,通常遵循以下步骤:
通过优化标志变量,可以避免在序列已经有序后继续不必要的遍历,提高算法效率。
给你一个整数数组 nums,请你将该数组升序排列。
本题是典型的排序问题,可直接使用冒泡排序求解。按照上述解题思路,通过多轮遍历、比较和交换,将数组升序排列。
import java.util.Arrays;
public class SortArray {
public int[] sortArray(int[] nums) {
int n = nums.length;
// 外层循环控制排序轮数,最多n-1轮
for (int i = 0; i < n - 1; i++) {
boolean swapped = false;
// 内层循环控制每轮比较的范围,每轮结束后最大元素已沉底,无需再比较
for (int j = 0; j < n - 1 - i; j++) {
if (nums[j] > nums[j + 1]) {
// 交换相邻元素
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
swapped = true;
}
}
// 若本轮无交换,说明数组已有序,提前退出
if (!swapped) {
break;
}
}
return nums;
}
public static void main(String[] args) {
SortArray solution = new SortArray();
int[] nums = {5, 2, 9, 1, 5, 6};
int[] sortedNums = solution.sortArray(nums);
System.out.println(Arrays.toString(sortedNums)); // 输出:[1, 2, 5, 5, 6, 9]
}
}
给定一个无序的数组 nums,返回数组在排序之后,相邻元素之间最大的差值。如果数组元素个数小于 2,则返回 0。
本题可先使用冒泡排序对数组进行排序,然后遍历排序后的数组,计算相邻元素的差值,记录最大差值。需要注意的是,由于冒泡排序在处理大规模数据时效率较低,本题仅作为冒泡排序应用的示例,实际解题中更推荐使用基数排序等高效算法。
public class MaximumGap {
public int maximumGap(int[] nums) {
int n = nums.length;
if (n < 2) {
return 0;
}
// 先使用冒泡排序对数组排序
bubbleSort(nums);
// 计算相邻元素的最大差值
int maxGap = 0;
for (int i = 1; i < n; i++) {
maxGap = Math.max(maxGap, nums[i] - nums[i - 1]);
}
return maxGap;
}
// 冒泡排序实现
private void bubbleSort(int[] nums) {
int n = nums.length;
for (int i = 0; i < n - 1; i++) {
boolean swapped = false;
for (int j = 0; j < n - 1 - i; j++) {
if (nums[j] > nums[j + 1]) {
int temp = nums[j];
nums[j] = nums[j + 1];
nums[j + 1] = temp;
swapped = true;
}
}
if (!swapped) {
break;
}
}
}
public static void main(String[] args) {
MaximumGap solution = new MaximumGap();
int[] nums = {3, 6, 9, 1};
System.out.println(solution.maximumGap(nums)); // 输出:3(排序后为[1,3,6,9],最大间距为6-3=3)
}
}
在计算机考研 408 中,冒泡排序是数据结构部分的基础考点,主要涉及以下几个方面:
冒泡排序作为最基础的排序算法之一,虽然在大规模数据排序中效率不高,但其简单直观的思想和清晰的执行过程,使其成为理解排序算法的入门首选。通过本文的学习,我们掌握了冒泡排序的算法思想、解题思路、LeetCode 实战应用以及考研 408 中的考点。
在学习过程中,建议结合手动模拟排序过程加深对算法的理解,同时对比其他简单排序算法(如插入排序、选择排序)的异同,形成系统的知识体系。对于考研 408 考生,需重点掌握冒泡排序的时间复杂度分析、稳定性判断以及与其他算法的对比,确保在考试中能够准确解答相关问题。
希望本文能够帮助读者更深入地理解冒泡排序,并在实际项目中发挥其优势。谢谢阅读!
希望这份博客能够帮助到你。如果有其他需要修改或添加的地方,请随时告诉我。