冒泡排序作为最经典排序算法,作为初学者一定要将该算法研究透彻,以下结论是本人通过别人的博客,以及动手草稿演算得出,个人理解有限,以最通俗易懂的方式解决:
冒泡排序字面意思即为一瓶汽水有很多大小不一的气泡分散附着于瓶壁,这样就是一个无序数组模式,大的气泡先上浮,小的气泡在瓶底,这样就是按照从小到大顺序排列
// 设定有一个无序数组:
int[] number = {8,3,4,2};
// 两两参数对比,每当前面一个数值大于后面一个数值,交换位置,直到最大一个数排到最后
初始数组为{8,3,4,2}
第一次交换:8与3对比,8比3大交换位置,交换后为:{3,8,4,2};
第二次交换:8与4对比,8比4大交换位置,交换后为:{3,4,8,2};
第三次交换:8与2对比,8比2大交换位置,交换后为:{3,4,2,8};
// 由此可得知该数组长度为4,交换3次后可得到最大数8,但是数组仍然是无序状态,那么就还需进行排序,且最大数固定不参与排序
// 当以上交换无法得出结论时,那么就需要再次进行一轮交换
第二轮:
第一次交换:3与4对比,3比4小不交换,结果为:{3,4,2,8};
第二次交换:4与2对比,4比2大交换位置,交换后为:{3,2,4,8};
// 仍然无法得出排序,进行第三轮排序:
第三轮:
第一次交换:3与2对比,3比2大交换位置,交换后为:{2,3,4,8};
// 由以上推论,可通过双重for循环进行遍历,外层循环控制轮数,内层循环控制每轮进行次数,长度为4的数组共进行三轮排序,可理解为进行了(number.length-1)轮,每轮间最大数不参与排序,可理解为第一轮有一个数不参与,第二轮有两个数,那么n轮就有(number.length-1-n)次交换,用以上长度为4的数组进行说明:
轮数:1 每轮交换次数:3
轮数:2 每轮交换次数:2
轮数:3 每轮交换次数:1
number.length-1 number.length-1-i (数组索引从0开始)
// 代码实现
public static void main(String[] args) {
// 冒泡排序
// 定义一个无序数组
int[] number = {68,25,3,14,65,34};
// 外层循环控制遍历趟数
for (int i = 0;i < number.length;i++){
// 内层循环控制每趟循环次数
for (int j =0 ;j < number.length-i-1;j++){
// 判断数组间每两个索引对比用于交换,大的参数赋值给临时变量,小的参数赋值到大的
// 位置,临时变量复制到小的位置实现交换
// 在此处我自己犯了一个错误,没有理解每轮之间单独的交换,将轮次与每轮之间交换的
// 次数作比较...很乱,也就是将number[i]与number[j]作判断,记录在此作为警醒今后
// 学习踏踏实实理解
if (number[j] > number[j+1]){
// 使用一个初始化变量用于接收交换
int temp = number[j];
number[j] = number[j+1];
number[j+1] = temp;
}
}
}
// 使用了Arrays类里的toString()方法
System.out.println(Arrays.toString(number));
}
该篇文章以一个初学者角度作出发,在各大佬博客中都有描写关于该算法的时间复杂度这个计算方法,无奈认知度有限无法深入解读记录,在该算法有优化结构,就是当排序到已经完成从小到大排序时可以无需再进行下一轮排序,学识有限...看不太懂大佬优化手法,以后更新该博客