JavaSE基础之冒泡排序优化问题
来源:互联网 发布:井柏然手写字体软件 编辑:程序博客网 时间:2024/05/29 03:01
【冒泡排序】
首先冒泡的思想是两两相邻比较,大的放前面。所以第一趟最大应该在最后一位,第二趟第二大的在倒数第二位。
规律应该看出来了,只是我的这个数组正好三次已经排完,但是当你不知道数组的具体数值的时候应该是排arr.length-1 次 ,
接下来代码实现:
public static void main(String[] args) { int[] arr={1,5,3,4,2}; //实现第一趟 for (int i = 0; i < arr.length-1; i++) { //如果当前比后面大,则交换 if(arr[i]>arr[i+1]){ int temp=arr[i]; arr[i]=arr[i+1]; arr[i+1]=temp; } } //实现第二趟 for (int i = 0 ; i < arr.length-2; i++) { if(arr[i]>arr[i+1]){ int temp=arr[i]; arr[i]=arr[i+1]; arr[i+1]=temp; } } //.... //规律出来了变化的只有arr.length减1减2... //综合上面规律得出最终: for (int i = 1; i < arr.length; i++) { for (int j = 0; j < arr.length-i; j++) { if(arr[j]>arr[j+1]){ int temp=arr[i]; arr[j]=arr[j+1]; arr[j+1]=temp; } } } System.out.printn(Arrays.toString(arr)); }
【优化】
如果数组本身已经有序,或者接近有序,以上的排序算法会做大量的无用的循环判断操作,比如上面我出的例子,三趟就能排好,所以我们需要对算法进行优化。
优化的方式是:设置一个标志flag为true,如果某一趟排序发生了变换,那么flag为false。如果某一趟排序没有发生交换,则说明序列已经有序了,不必再进行继续的比较操作,此时flag为true,代码如下:
public static void main(String[] args) { int[] arr = { 1, 3, 5, 4, 2 }; for (int i = 1; i < arr.length; i++) { //建立标志Flag boolean flag = true; for (int j = 0; j < arr.length - i; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; // 如果某一趟排序发生了变换,那么flag为false。 //如果某一趟排序没有发生交换,则说明序列已经有序了 flag = false; } } //如果flag 还是true ,说明这一趟并没有交换,所以没有必要进行后面排序 if (flag) { break; } } }
冒泡排序是面试中常见的排序算法,但是你的回答没有亮点的话,就失去一次提分的机会,此方法仅供参考,假如有更好的方式,请私信我,谢谢啦。
阅读全文
0 0
- JavaSE基础之冒泡排序优化问题
- JavaSE基础笔记之冒泡排序
- javaSe算法之冒泡排序
- JAVASE总结--冒泡排序
- JavaSE:冒泡法排序
- javaSE基础编程——排序(冒泡,选择)
- java基础之冒泡排序
- 基础之冒泡排序法
- java基础之冒泡排序
- 基础算法之冒泡排序
- 算法基础之冒泡排序
- 算法基础之冒泡排序
- C#基础之冒泡排序
- JavaEE基础之冒泡排序
- 基础算法之 冒泡排序
- JavaSE基础笔记之直接排序
- 排序算法入门之冒泡排序优化
- 排序算法之冒泡排序 - 优化版
- Ubuntu服务器打开/关闭mysql远程连接
- session理论以及解决分布式系统下的session共享问题
- 第一次参加ACM比赛 2017ICPC北京赛区
- springboot+mybatis+shiro框架
- KMP算法
- JavaSE基础之冒泡排序优化问题
- 学习一门新语言的步骤和基础
- 素数的求取
- SVN的学习之路三(注册和启动服务)
- construct 2 设计一款鸡汤类游戏
- JDBC01
- iframe里面使用外部整体框架属性
- 电脑出现黑屏,无法显示桌面
- innodb存储引擎