1 概述
冒泡排序(Bubble Sort)是排序算法里面比较简单的一个排序。它重复地走访要排序的数列,一次比较两个数据元素,如果顺序不对则进行交换,并一直重复这样的走访操作,直到没有要交换的数据元素为止。
2 原理
从第一个元素开始,相邻比较,把较大的数值替换到后面,直到最后一个元素,然后再从第一个元素开始,相邻比较,把较大的数值替换到后面,直到倒数第二个元素,依此类推。
假设待排序的数组为:
先将91、60做比较,并把大的数值排到后面:
再将91、96比较,并把大的数值排到后面:
再将96、13比较,并把大的数值排到后面:
再将96、35比较,并把大的数值排到后面:
依此类推,第一轮全部排完后,结果为:
然后进行第二轮冒泡,依然从第一、二个元素开始,先将60、91进行比较:
然后再将91、13进行比较:
依此类推,相邻比较,但不比较最后一个元素,第二轮比较后结果为:
然后进行第三轮、第四轮,直到冒泡到第1个元素截止,此时会发现,整个数组已经是有序数组了:
3 代码示例
/**
* 互换顺序
*
* @param nums 数组
* @param srcIndex 源下标
* @param descIndex 目标下标
* @author Korbin
* @date 2022-10-17 18:20:51
**/
private static void swap(int[] nums, int srcIndex, int descIndex) {
int tmp = nums[srcIndex];
nums[srcIndex] = nums[descIndex];
nums[descIndex] = tmp;
}
/**
* 冒泡排序
*
* @param nums 输入
* @author Korbin
* @date 2022-10-11 18:10:28
**/
public static void bubbleSort(int[] nums) {
int length = nums.length;
if (length > 1) {
// 如果数组只有1位则直接返回
for (int i = nums.length - 1; i > 0; i--) {
for (int j = 0; j < i; j++) {
if (nums[j] > nums[j + 1]) {
swap(nums, j, j + 1);
}
}
}
}
}
4 优化思路
如上所述,从后往前进行冒泡,那么可能会碰到一种情况:排序到某一个元素时,其前面的所有元素均是有序数据,不需要再排序了。
这种情况,就无需再浪费时间和空间进行排序,直接返回即可得到有序数据,而要实现也比较简单:每轮冒泡时,判断是否有进行过位置调整,若未进行,则表示前面的元素均为有序数据,代码实现如下:
/**
* 冒泡排序
*
* @param nums 输入
* @author Korbin
* @date 2022-10-11 18:10:28
**/
public static void bubbleSort(int[] nums) {
int length = nums.length;
if (length > 1) {
for (int i = nums.length - 1; i > 0; i--) {
// 如果数组只有1位则直接返回
boolean doSort = false;
for (int j = 0; j < i; j++) {
if (nums[j] > nums[j + 1]) {
swap(nums, j, j + 1);
doSort = true;
}
}
// 如果未进行过顺序调整,则表示前面的元素均为有序元素
if (!doSort) {
break;
}
}
}
}