携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第9天,点击查看活动详情
往期内容
前言
书接上回,上期学习的二分查找,今天来学习一下冒泡排序,希望大家共同讨论,有所收获!!!
算法描述
- 依次比较数组中相邻两个元素大小,若 a[j] > a[j+1],则交换两个元素,两两都比较一遍称为一轮冒泡,结果是让最大的元素排至最后
- 重复以上步骤,直到整个数组有序
算法实现
public static void bubble(int[] a) {
for (int j = 0; j < a.length - 1; j++) {
for (int i = 0; i < a.length - 1 - j; i++) {
if (a[i] > a[i + 1]) {
int tmp = a[i];
a[i] = a[i + 1];
a[i + 1] = tmp;
}
}
System.out.println("第" + j + "轮冒泡" + Arrays.toString(a));
}
}
测试代码
public static void main(String[] args) {
int[] array = {1, 40, 47, 3, 20, 35, 49, 60, 8, 11, 48};
bubble(array);
}
运行结果
第0轮冒泡[1, 40, 3, 20, 35, 47, 49, 8, 11, 48, 60]
第1轮冒泡[1, 3, 20, 35, 40, 47, 8, 11, 48, 49, 60]
第2轮冒泡[1, 3, 20, 35, 40, 8, 11, 47, 48, 49, 60]
第3轮冒泡[1, 3, 20, 35, 8, 11, 40, 47, 48, 49, 60]
第4轮冒泡[1, 3, 20, 8, 11, 35, 40, 47, 48, 49, 60]
第5轮冒泡[1, 3, 8, 11, 20, 35, 40, 47, 48, 49, 60]
第6轮冒泡[1, 3, 8, 11, 20, 35, 40, 47, 48, 49, 60]
第7轮冒泡[1, 3, 8, 11, 20, 35, 40, 47, 48, 49, 60]
第8轮冒泡[1, 3, 8, 11, 20, 35, 40, 47, 48, 49, 60]
第9轮冒泡[1, 3, 8, 11, 20, 35, 40, 47, 48, 49, 60]
优化思路
- 优化点1:每经过一轮冒泡,内层循环就可以减少一次
- 优化点2:如果某一轮冒泡没有发生交换,则表示所有数据有序,可以结束外层循环
优化代码
public static void bubble_v2(int[] a) {
int n = a.length - 1;
// 轮数
int j = 0;
do {
j++;
// 表示最后一次交换索引位置
int last = 0;
for (int i = 0; i < n; i++) {
if (a[i] > a[i + 1]) {
int tmp = a[i];
a[i] = a[i + 1];
a[i + 1] = tmp;
last = i;
}
}
n = last;
System.out.println("第" + j + "轮冒泡" + Arrays.toString(a));
} while (n != 0);
}
测试代码
public static void main(String[] args) {
int[] array1 = {1, 40, 47, 3, 20, 35, 49, 60, 8, 11, 48};
bubble_v2(array1);
}
运行结果
第1轮冒泡[1, 40, 3, 20, 35, 47, 49, 8, 11, 48, 60]
第2轮冒泡[1, 3, 20, 35, 40, 47, 8, 11, 48, 49, 60]
第3轮冒泡[1, 3, 20, 35, 40, 8, 11, 47, 48, 49, 60]
第4轮冒泡[1, 3, 20, 35, 8, 11, 40, 47, 48, 49, 60]
第5轮冒泡[1, 3, 20, 8, 11, 35, 40, 47, 48, 49, 60]
第6轮冒泡[1, 3, 8, 11, 20, 35, 40, 47, 48, 49, 60]
第7轮冒泡[1, 3, 8, 11, 20, 35, 40, 47, 48, 49, 60]
大家多多讨论学习salute