经典排序算法 - 冒泡排序Bubble sort

原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换,这样一趟过去后,最大或最小的数字被交换到了最后一位,然后再从头开始进行两两比较交换,直到倒数第二位时结束,其余类似,看例子。

例子为从小到大排序,为了便于观察,选取

原始待排序数组:| 6 | 2 | 4 | 1 | 5 | 9 |

第一趟排序(外循环)

第一次两两比较6 > 2交换(内循环)

交换前状态| 6 | 2 | 4 | 1 | 5 | 9 |

交换后状态| 2 | 6 | 4 | 1 | 5 | 9 |

第二次两两比较,6 > 4交换

交换前状态| 2 | 6 | 4 | 1 | 5 | 9 |

交换后状态| 2 | 4 | 6 | 1 | 5 | 9 |

第三次两两比较,6 > 1交换

交换前状态| 2 | 4 | 6 | 1 | 5 | 9 |

交换后状态| 2 | 4 | 1 | 6 | 5 | 9 |

第四次两两比较,6 > 5交换

交换前状态| 2 | 4 | 1 | 6 | 5 | 9 |

交换后状态| 2 | 4 | 1 | 5 | 6 | 9 |

第五次两两比较,6 < 9不交换

交换前状态| 2 | 4 | 1 | 5 | 6 | 9 |

交换后状态| 2 | 4 | 1 | 5 | 6 | 9 |

第二趟排序(外循环)

第一次两两比较2 < 4不交换

交换前状态| 2 | 4 | 1 | 5 | 6 | 9 |

交换后状态| 2 | 4 | 1 | 5 | 6 | 9 |

第二次两两比较,4 > 1交换

交换前状态| 2 | 4 | 1 | 5 | 6 | 9 | 
交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |

第三次两两比较,4 < 5不交换

交换前状态| 2 | 1 | 4 | 5 | 6 | 9 | 
交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |

第四次两两比较,5 < 6不交换

交换前状态| 2 | 1 | 4 | 5 | 6 | 9 |

交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |

第三趟排序(外循环)

第一次两两比较2 > 1交换

交换后状态| 2 | 1 | 4 | 5 | 6 | 9 |

交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |

第二次两两比较,2 < 4不交换

交换后状态| 1 | 2 | 4 | 5 | 6 | 9 | 
交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |

第三次两两比较,4 < 5不交换

交换后状态| 1 | 2 | 4 | 5 | 6 | 9 | 
交换后状态| 1 | 2 | 4 | 5 | 6 | 9 |

第四趟排序(外循环)无交换

第五趟排序(外循环)无交换

排序完毕,输出最终结果1 2 4 5 6 9

下面是代码实现(仅供参考),为了更直观地表示优化结果,选取

原始待排序数组:|2|1|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|

public class BubbleSort2 {public int[] bubbleSort(int[] A, int n) {boolean flag = true;for (int i = 0; i < n && flag; i++) {flag = false;for (int j = i; j < n; j++) {if (A[i] > A[j]) {int temp = A[i];A[i] = A[j];A[j] = temp;flag = true;}}}return A;}public static void main(String args[]) {int A[] = { 2, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 };int n = A.length;BubbleSort bubbleSort = new BubbleSort();double start = System.currentTimeMillis();int B[] = bubbleSort.bubbleSort(A, n);for (int i = 0; i < n; i++)System.out.print(B[i] + ",");double end = System.currentTimeMillis();System.out.println("\n程序运行时间:" + (end - start) + "毫秒");}
}

输出:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,
程序运行时间:1.0毫秒

显然,这样的程序是有问题的。因为除了第一和第二个关键字需要交换外,别的都已经是正常顺序,,当 i=1 时,交换了2和1,此时序列已经有序,但是算法仍然不依不饶地将 i=2 到 i=29 比较一遍。尽管并没有交换数据,但是之后的大量比较还是大大多余了。

public class BubbleSort2 {public int[] bubbleSort(int[] A, int n) {boolean flag = true;// flag作为标记for (int i = 0; i < n && flag; i++) {// 当flag为true时退出循环flag = false;// 初始flag为falsefor (int j = i; j < n; j++) {if (A[i] > A[j]) {int temp = A[i];A[i] = A[j];A[j] = temp;flag = true;// 如果有数据交换,则flag为true}}}return A;}public static void main(String args[]) {int A[] = { 2, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 };int n = A.length;BubbleSort bubbleSort = new BubbleSort();double start = System.currentTimeMillis();int B[] = bubbleSort.bubbleSort(A, n);for (int i = 0; i < n; i++)System.out.print(B[i] + ",");double end = System.currentTimeMillis();System.out.println("\n程序运行时间:" + (end - start) + "毫秒");}
}

输出:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,
程序运行时间:0.0毫秒

由此可见,稍微加个flag,程序运行时间缩短了。

经典冒泡排序及其优化相关推荐

  1. 十大经典排序算法之冒泡排序及其优化

    一.冒泡排序 1.冒泡排序算法的原理如下: 1.比较相邻的元素.如果第一个比第二个大,就交换他们两个. 2.对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大 ...

  2. 带哨兵的冒泡排序_冒泡排序的优化以及快排过程及优化

    冒泡排序的优化: 1.加入哨兵.2.记住每一次交换的最后位置,该位置以后的为有序,不需要改变. 1.快速排序的基本思想: 快速排序使用分治的思想,通过一趟排序将待排序列分割成两部分,其中一部分记录的关 ...

  3. Java的知识点18——数组存储表格数据、冒泡排序的基础算法、冒泡排序的优化算法、二分法查找

    数组存储表格数据 package cn.dym08; import java.util.Arrays; public class Test09 {public static void main(Str ...

  4. 排序算法:冒泡排序算法优化实现及分析

    冒泡排序算法介绍 冒泡排序(Bubble Sort)一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序记录为止.这是书上的定义,感觉太弯弯肠子了.冒泡排序是几乎所有学 ...

  5. java每轮排序结果,冒泡排序及其优化java

    java冒泡排序及其优化## version1 public static void bubbleSort() { int[] arr={5,6,1,4,3,2,7,8}: for (int i = ...

  6. C语言冒泡排序的优化(图解+代码)

    目录 1.常规的冒泡排序算法: 2.冒泡排序的优化: 1.常规的冒泡排序算法: 降序排列,小的数往下沉,大的数往上升: 升序排列,小的数在最上边,最大的数在最下边. 假设数组有n个数据,则无论最开始数 ...

  7. python 冒泡排序及优化_Python冒泡排序及优化

    一.冒泡排序简介 冒泡排序(Bubble Sort)是一种常见的排序算法,相对来说比较简单. 冒泡排序重复地走访需要排序的元素列表,依次比较两个相邻的元素,如果顺序(如从大到小或从小到大)错误就交换它 ...

  8. 【PHP】冒泡排序以及优化

    最近看了一下冒泡排序这个经典的算法,在网上也看到了很多改进冒泡排序算法的方式,这里总结一下: 冒泡排序最简单的实现方式如下(我用PHP来实现,用其他语言也是一样的): for($i=0;$i<$ ...

  9. java 鸡尾酒排序_冒泡排序及优化(Java实现)

    向大端冒泡 public class BubbleSort { public static > void sort(T[] arr) { for (int i = 0, len = arr.le ...

最新文章

  1. iOS8.0 之后指纹解锁
  2. Arcgis for JS之Cluster聚类分析的实现
  3. CCF201403-1 相反数(100分)
  4. linux mysql误删,linux下MySQL安装与删除 (Ubuntu)
  5. 2 使用_索尼黑卡RX100M6的使用指南2
  6. 信息学奥赛一本通 1109:开关灯 | OpenJudge NOI 1.5 31:开关灯
  7. ActiveMQ的消息的(含附件)发送和接收使用
  8. 开心记账本 投资理财两不误
  9. SQL Server 2008 对 T-SQL 语言的增强(转载)
  10. Dropthings - Ajax Web Portal
  11. 091030 T 焦点在外,框架API设计
  12. VS2008 SP1安装失败
  13. 实战二:手把手教你图像风格迁移
  14. 北京大学历届学生名单 计算机,北京大学历史系历届学生名单
  15. Skipped,remains conflicted
  16. 解决使用python-igraph绘制网络图时报错AttributeError: plotting not available
  17. Flink-FileSystem
  18. 一个人对家的态度藏着最真实的人品
  19. 相干载波同步误差对相干解调的影响
  20. 10.梯度、激活函数和loss

热门文章

  1. WinForm Paenl里面添加Form
  2. ajax 复制到“剪贴板”
  3. 爱课程c语言函数2的作业答案,C语言程序设计
  4. java取非_java运算符 与()、非(~)、或(|)、异或(^)
  5. android高德地图搜索地址,地点/周边搜索-Android平台-开发指南-高德地图车机版 | 高德地图API...
  6. python自带sqlite库_Python标准库之sqlite3使用实例
  7. java 分布式编译_linux分布式编译distcc和ccache的部署
  8. mysql数据库备份shell_mysql数据库备份shell脚本分享
  9. java电脑运行视频演示_javaweb视频第一天(二)
  10. 编程挑战系统的输入和输出详细说明