本章介绍Java经典排序算法中的冒泡排序,欢迎各位同学转载,但转载务必注明出处:https://blog.csdn.net/qq_35101450/article/details/89072688,谢谢~
冒泡排序,算法如其名,我们可以把要排序的每一个元素想象成一个泡泡,数组或者集合相当于装这些泡泡的大水缸,那小的泡泡比较轻,会慢慢冒上来,大的泡泡比较重,就会沉下去(当然泡泡都是浮在水面上的 ,你就当是大的泡泡太胖了,水都浮不起它~)
其实我们上体育课排成一列的时候,就采用的是冒泡排序的原理,相邻两个同学进行比较,高的往后站,矮的往前移,第一轮比较完之后,个子最高的就排在了最后面,我们在下一轮比较的时候就不考虑他了。然后继续下一轮的比较,以此类推,直到排好序为止。
原理图:
代码示例:
package String;
public class BubbleSortDemo {
public static void main(String[] args) {
// 原始数组
int[] arr = { 24, 69, 80, 57, 13 };
System.out.println("排序前:");
printArray(arr);
bubbleSort(arr);
System.out.println("排序后:");
printArray(arr);
}
// 冒泡排序
private static void bubbleSort(int[] arr) {
for (int x = 0; x < arr.length - 1; x++) {// 外层循环控制需要比较多少轮,总共需要比较数组长度-1次
for (int y = 0; y < arr.length - 1 - x; y++) {// 内层循环控制每轮比较多少次
if (arr[y] > arr[y + 1]) {
int temp = arr[y];// 把较大的值先存起来
arr[y] = arr[y + 1];// 把小的值“冒”上去
arr[y + 1] = temp;// 把大的值往后移
}
}
}
}
private static void printArray(int[] arr) {
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
if (i == arr.length - 1) {// 最后一个元素
System.out.println(arr[i] + "]");
} else {
System.out.print(arr[i] + ",");
}
}
}
}
运行结果:
排序前:
[24,69,80,57,13]
排序后:
[13,24,57,69,80]
如果我们拿到的数据本来就是一个已经排好序的数组,或者说在某一次排序完成后,数组已经排好序,那我们就没有必要继续排序了。所以我们可以这样做,初始化一个标记位,在每一轮排序时把这个标记位赋值为0,在进入内循环排序过程中,如果元素没有进行了交换操作,说明数组已经排好序,这时跳出循环,完成排序。
代码示例:
package String;
public class BubbleSortDemo {
public static void main(String[] args) {
// 原始数组
int[] arr = { 24, 69, 80, 57, 13, 15, 66, 88, 86 };
System.out.println("排序前:");
printArray(arr);
bubbleSort(arr);
System.out.println("排序后:");
printArray(arr);
}
// 冒泡排序
private static void bubbleSort(int[] arr) {
int flag = 1;
int count = 0;
for (int x = 0; x < arr.length - 1; x++) {// 外层循环控制需要比较多少轮,总共需要比较数组长度-1次
flag = 0;// 每次置为0
count++;
for (int y = 0; y < arr.length - 1 - x; y++) {// 内层循环控制每轮比较多少次
if (arr[y] > arr[y + 1]) {
flag = 1;
int temp = arr[y];// 把较大的值先存起来
arr[y] = arr[y + 1];// 把小的值“冒”上去
arr[y + 1] = temp;// 把大的值往后移
}
}
System.out.print("第" + (x+1) + "次排序后:");
printArray(arr);
if (0 == flag) {// 某一轮排序过程中,元素没有交换,则跳出
break;
}
}
System.out.println("第" + count + "次发现已经排好序,则停止排序");
}
private static void printArray(int[] arr) {
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
if (i == arr.length - 1) {// 最后一个元素
System.out.println(arr[i] + "]");
} else {
System.out.print(arr[i] + ",");
}
}
}
}
运行结果:
排序前:
[24,69,80,57,13,15,66,88,86]
第1次排序后:[24,69,57,13,15,66,80,86,88]
第2次排序后:[24,57,13,15,66,69,80,86,88]
第3次排序后:[24,13,15,57,66,69,80,86,88]
第4次排序后:[13,15,24,57,66,69,80,86,88]
第5次排序后:[13,15,24,57,66,69,80,86,88]
第5次发现已经排好序,则停止排序
排序后:
[13,15,24,57,66,69,80,86,88]
以上是对冒泡排序的讲解,面试经常会问到,大家有疑问欢迎评论,我看到会第一时间回复~