
排序算法——冒泡排序
什么是冒泡排序
冒泡排序的英文Bubble Sort,是一种基础的交换排序。
这种排序算法的每一个元素都可以像小气泡一样,根据自身大小,一点一点向着数组的一侧移动。
举个例子,将一个无需数列5, 8, 6, 3, 9, 2, 1, 7
,从小到大排序
排序流程图
最外层的 for
循环每经过一轮,剩余数字中的最大值就会被移动到当前轮次的最后一位,中途也会有一些相邻的数字经过交换变得有序。
第一轮排序:
第二轮排序
三到七轮结果
算法实现
基础实现
冒泡最基础的实现方式如下:
public class BubbleSort {
public static int[] sort1(int array[]) {
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array.length - 1 - i; j++) { // arr.length - 1 - i:数组遍历i之后的大小
if (array[j] > array[j + 1]) { // 如果左边的数大于右边,则交换
int tmp = array[j];
array[j] = array[j + 1];
array[j + 1] = tmp;
}
}
}
return array;
}
}
改良实现
如上图,在每次的外层循环时,进行判断,如果没有发生过交换,那么此时数组就是有序,则可以不用继续循环。
public void sort2() {
int[] arr = {3, 5, 4, 2, 1};
boolean swapped;
for (int i = 0; i < arr.length; i++) {
swapped = false;
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int tmp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tmp;
swapped = true;
}
}
if (!swapped) break;
}
System.out.println(Arrays.toString(arr));
}
进一步优化代码:
public void sort3() {
int[] arr = {3, 5, 4, 2, 1};
boolean swapped = true;
int indexOfLastUnosortedElement = arr.length - 1;
int swappedIndex = -1;
while(swapped) {
swapped = false;
for (int i = 0; i < indexOfLastUnosortedElement; i++) {
if (arr[i] > arr[i + 1]) {
int tmp = arr[i];
arr[i] = arr[i + 1];
arr[i + 1] = tmp;
swapped = true;
swappedIndex = i; // 更新交换位置
}
}
indexOfLastUnosortedElement = swappedIndex;
}
System.out.println(Arrays.toString(arr));
}
最外层的 while 循环每经过一轮,剩余数字中的最大值仍然是被移动到当前轮次的最后一位。
在下一轮比较时,只需比较到上一轮比较中,最后一次发生交换的位置即可。因为后面的所有元素都没有发生过交换,必然已经有序了。
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 zxb
评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果