冒泡排序通俗点讲就是将我们的数字一次次像泡泡一样往上冒
思路讲解:
首先我们以一个数据为例子,有一个数组,arr[2,24,13,80,75,51]。
先看第一次循环:
根据第一次遍历可以看出我们找到了第一个最大的数80
在来看第二次遍历:
根据这次遍历我们又得到了第二个最大的数75,但是你们发现没有我们是不是少做了一次比较,这次我们做了4次比较。
依次执行下面直接放图片了
最后我们就得到了这个排序好的数组最后我们总结一下
代码实现:
首先我们先化繁为简,先从最简单的开始理解
简单代码实现:
int[] arr = {2, 24, 13, 80, 75, 51};
int temp = 0; // 我们要定义一个交换的临时变量
for (int i = 0; i < 5; i++) {//我们第一次循环循环5次,找到最大的数字,放到数组后{2, 13, 24, 51, 75, 80}
if (arr[i] > arr[i + 1]) {
temp = arr[i + 1];
arr[i + 1] = arr[i];
arr[i] = temp;
}
}
for (int i = 0; i < 4; i++) {//我们第二次循环循环4次,找到最大的数字,放到数组后{2, 13, 24, 51, 75, 80}
if (arr[i] > arr[i + 1]) {
temp = arr[i + 1];
arr[i + 1] = arr[i];
arr[i] = temp;
}
}
for (int i = 0; i < 3; i++) {//我们第三次循环循环3次,找到最大的数字,放到数组后{2, 13, 24, 51, 75, 80}
if (arr[i] > arr[i + 1]) {
temp = arr[i + 1];
arr[i + 1] = arr[i];
arr[i] = temp;
}
}
for (int i = 0; i < 2; i++) {//我们第二次循环循环2次,找到最大的数字,放到数组后{2, 13, 24, 51, 75, 80}
if (arr[i] > arr[i + 1]) {
temp = arr[i + 1];
arr[i + 1] = arr[i];
arr[i] = temp;
}
}
for (int i = 0; i < 1; i++) {//我们第一次循环循环1次,找到最大的数字,放到数组后{2, 13, 24, 51, 75, 80}
if (arr[i] > arr[i + 1]) {
temp = arr[i + 1];
arr[i + 1] = arr[i];
arr[i] = temp;
}
}
for (int i=0; i<arr.length; i++){
System.out.print("\t" + arr[i]);
}
}
这是简单的理解我们把每一次循环进行了拆解,形成了不是嵌套的多次for循环,跟着这段思路我们接着想,怎么可以优化代码呢,我们想我们多次for循环都是做了一件事就是if判断,然后交换,那么我可不可以进行一下嵌套循环呢,让我们的外层循环循环5次,内层循环每次相应减少是不是可以呢。
优化代码如下:
int[] arr = {2, 24, 13, 80, 75, 51};
int temp = 0; // 我们要定义一个交换的临时变量
for (int i = 0; i < 5; i++) {//外层循环使我们要循环的5次
for (int j=0; j<5-i; j++){//内存循环是每一次外层循环下我要找到一个最大值,至于为甚是5-i 大家可以好好思考一下
if (arr[j] > arr[j + 1]) {
temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
}
for (int i=0; i<arr.length; i++){
System.out.print("\t" + arr[i]);
}
建议:冒泡排序是一个基础的排序算法,但是时间复杂度也是很高,所以我们只需要学习他的思想即可。