持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情
本文系作者 不太自律的程序猿原创,转载请私信并在文章开头附带作者和原文地址链接。
冒泡排序算法
冒泡排序(Bubble Sort)是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。
冒泡排序思想
1.比较相邻的两个元素,如果第一个元素大于第二个元素,就交换位置
2.对每一对相邻的元素再做同样的比较,从最开始的一对到结尾的一对完成全部的比较。最后一个元素肯定最大的
3.对剩下的元素重复第二步操作,直到只有一个元素为止
模拟冒泡排序
//模拟冒泡排序 int[] arr = {8,1,2,7,6,5,4,3}; //每相邻的元素进行比较大小 //遍历数组 // 第1趟 1,2,7,6,5,4,3,[8] 7次 // 第2趟 1,2,6,5,4,3,[7] 6次 // 第3趟 1,2,5,4,3,[6] 5次 // 第4趟 1,2,4,3,[5] 4次 // 第5趟 1,2,3,[4] 3次 // 第6趟 1,2,[3] 2次 // 第7趟 1,[2] 1次 //分析: // 共比较趟数 arr.length-1 // 每一趟中比较的次数: 趟数+次数 = 8(arr.length) // 两个变量互换值 //System.out.println(Arrays.toString(arr)); for (int i = 0; i < arr.length - 1; i++) {//控制趟数 for (int j = 0; j < arr.length - 1 - i; j++) {//控制次数 //比较相邻元素的值 if(arr[j] > arr[j+1]){ int t = arr[j]; arr[j] = arr[j+1]; arr[j+1] = t; } } System.out.println(Arrays.toString(arr)); }现状:
1、我们会发现在第五轮冒泡后就没有发生过交换行为,后续的第六轮和第七轮都是无效循环,浪费资源。
解决方案: 若数组本身有序,则不需要进行每次循环判断,增加一个标志位标识每次是否进行交换即可。
冒泡排序的优化
for (int i = 0; i < arr.length - 1; i++) {//控制趟数
//定义boolean类型变量,用来标识每趟是否存在交换值
boolean flag = false;
for (int j = 0; j < arr.length - 1 - i; j++) {//控制次数
//比较相邻元素的值
if(arr[j] > arr[j+1]){
int t = arr[j];
arr[j] = arr[j+1];
arr[j+1] = t;
flag = true;//说明这趟存在交换值情况
}
}
System.out.println(Arrays.toString(arr));
if(!flag){
break;//若flag为false,表示此趟不存在交换值的情况,提前结束循环
}
}
感谢诸君的观看,文中如有纰漏,欢迎在评论区来交流。如果这篇文章帮助到了你,欢迎点赞👍关注。