冒泡排序

冒泡排序是入门级的算法,但也有一些有趣的玩法。

通常来说,冒泡排序有三种写法:

一边比较一边向后两两交换,将最大值/最小值冒泡到最后一位;

经过优化的写法:使用一个变量记录当前轮次的比较是否发生过交换,

如果没有发生交换表示已经有序,不再继续排序

进一步优化的写法:除了使用变量记录当前轮次的是否发生交换外,

再使用一个变量记录上一次发生交换的位置,下一轮排序时,

到达上一次交换的位置就停止比较

冒泡排序的第一种写法

private static void bubbleSort(int[] 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]) {//如果左边的数大于右边的数,则交换,保证右边的数字最大swap(arr, j, j+1);}}}}
//交换元素private static void swap(int[] arr,int i,int j) {int temp=arr[i];arr[i]=arr[j];arr[j]=temp;}

最外层的 for 循环每经过一轮,剩余数字中的最大值就会被移动到当前轮次的最后一位,中途也会有一些相邻的数字经过交换变得有序。

这种写法相当于相邻的数字两两比较,并且规定:“谁大谁站右边”。

整个过程看起来就像一个个气泡不断上浮,这也是“冒泡排序法”名字的由来。

冒泡排序的第二种写法

private static void bubbleSort(int[] arr) {//初始化swapped为true,否则排序过程无法启动boolean swapped =true;for (int i = 0; i < arr.length-1; i++) {//如果没有发生过交换,说明剩余部分已经有序,排序完成if (!swapped) {break;}//设置swapped为false,如果发生交换则将其设置为trueswapped=false;for (int j = 0; j < arr.length-1-i; j++) {if (arr[j]>arr[j+1]) {//如果左边的数大于右边的数,则交换,保证右边的数字最大swap(arr, j, j+1);//表示发生了交换swapped=true;}}}}
//交换元素private static void swap(int[] arr,int i,int j) {int temp=arr[i];arr[i]=arr[j];arr[j]=temp;}

最外层的 for 循环每经过一轮,剩余数字中的最大值仍然是被移动到当前轮次的最后一位。

这种写法相对于第一种写法的优点是:如果一轮比较中没有发生过交换,则立即停止排序,因为此时剩余数字一定已经有序了。

图中可以看出:

  1. 第一轮排序将数字 6 移动到最右边;
  2. 第二轮排序将数字 5 移动到最右边,同时中途将 1 和 2 排了序;
  3. 第三轮排序时,没有发生交换,表明排序已经完成,不再继续比较。

冒泡排序的第三种写法

public static void bubbleSort(int[] arr) {boolean swapped = true;// 最后一个没有经过排序的元素的下标int indexOfLastUnsortedElement = arr.length - 1;// 上次发生交换的位置int swappedIndex = -1;while (swapped) {swapped = false;for (int i = 0; i < indexOfLastUnsortedElement; i++) {if (arr[i] > arr[i + 1]) {// 如果左边的数大于右边的数,则交换,保证右边的数字最大swap(arr, i, i + 1);// 表示发生了交换swapped = true;// 更新交换的位置swappedIndex = i;}}// 最后一个没有经过排序的元素的下标就是最后一次发生交换的位置indexOfLastUnsortedElement = swappedIndex;}}// 交换元素private static void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}

经过再一次的优化,代码看起来就稍微有点复杂了。

最外层的 while 循环每经过一轮,剩余数字中的最大值仍然是被移动到当前轮次的最后一位。

在下一轮比较时,只需比较到上一轮比较中,最后一次发生交换的位置即可。因为后面的所有元素都没有发生过交换,必然已经有序了。

当一轮比较中从头到尾都没有发生过交换,则表示整个列表已经有序,排序完成。

冒泡排序及其三种写法相关推荐

  1. 冒泡排序BubbleSort(两种写法)

    冒泡排序的核心理念是什么?那就是相邻两数比较,前面的数比后面的数小的话,就交换位置,每次循环找到该次排序的最小值,然后放到该次循环数组的队尾,因此便利到最后,留的就是最大的数. 那么在这里说下冒泡排序 ...

  2. java 冒泡排序的三种写法_冒泡排序的三种实现(Java)

    冒泡排序是非常好理解的,以从小到大排序为例,每一轮排序就找出未排序序列中最大值放在最后. 设数组的长度为N: (1)比较前后相邻的二个数据,如果前面数据大于后面的数据,就将这二个数据交换. (2)这样 ...

  3. 冒泡排序及其三种优化方案

    一.传统的冒泡排序: 图解: 代码示例: /** * 传统冒泡排序 * @author Abel */int[] a={3,2,5,8,4,7,6,9}; for(int i=0; i<8; i ...

  4. JS冒泡排序的6种写法(武当雄风)

    天下英雄出我辈,一入江湖岁月催.鸿图霸业谈笑间,不胜人生一场醉. 武当山上,一年一度的试道大会又开始了... 众武当弟子摩拳擦掌都想在此次试道大会上一展风采... 张三丰临终前曾留下一句话:试道大会采 ...

  5. Javascript闭包和闭包的几种写法及用途

    好久没有写博客了,过了一个十一长假都变懒了,今天总算是恢复状态了.好了,进入正题,今天来说一说javascript里面的闭包吧!本篇博客主要讲一些实用的东西,主要将闭包的写法.用法和用途.  一.什么 ...

  6. JavaScript 立即执行函数的两种写法

    (function(str){console.log(str+'欢迎你~');})('行步至春深');(function(str) {console.log(str+'欢迎你~');}('行路易知难' ...

  7. WindowsServer2012史记7-茴香豆的五种写法和四种”显示计算机”的方法

    消失的"计算机"? [这周九叔工作比较忙,还有其他琐事缠身,因此SystemCenter2012SP1系列的发布稍慢,抱歉了各位.] 众所周知,WindowsServer2012和 ...

  8. Android代码规范----按钮单击事件的四种写法

    [前言] 按钮少的时候用第三种的匿名内部类会比较快,比如写demo测试的时候或者登陆界面之类. 按钮多的时候一般选择第四种写法. 一.第一种写法:在XML文件中声明onClick属性(很少用) 在XM ...

  9. php编写星期几,PHP实现今天是星期几的几种写法

    复制代码 代码如下: // 第一种写法 $da = date("w"); if( $da == "1" ){ echo "今天是星期一"; ...

最新文章

  1. 量子信息技术研究现状与未来
  2. python招聘笔试题_滴滴2020年春招笔试题分析(Python)
  3. 2021年吉林高考成绩何时查询,2021年吉林高考成绩什么时候出来,几点可以查询到...
  4. php 类调用本身方法,php几个关于类的预定义自动调用方法
  5. Pyppeteer库之四:Pyppeteer的页面操作(下)
  6. 海南计算机网络技术学校,三亚广播电视大学计算机网络技术专业_海南报名_网络教育计算机网络技术专业教学计划_中国教育在线...
  7. Spring Boot 2.0与Java 9
  8. 空间波(space wave)
  9. CentOS7安装dnf报错:No package dnf available
  10. python 移动平均线_如何使用NumPy计算移动平均线?
  11. Android开发之OpenCV实战:开发环境的搭建(身份证号码识别为例)
  12. 自己动手定制winpe+各类dos工具箱U盘启动盘+minilinux
  13. 计算机技术在风景园林中的应用和选择,现代信息技术在风景园林中的应用
  14. R语言select()filter()subset()筛选函数
  15. ems与nms_求教OMC、EMS、NMS的区别和不同?
  16. 定义函数:判断一个数是否为素数,并调用
  17. FixedUpdate
  18. webdav使用mysql_WebDAV Client
  19. zabbix监控nginx状态,显示状态active,accepts,handled,requests
  20. Photoshop CS2 视频教程-PS背景橡皮擦工具(转)

热门文章

  1. 冰雪奇缘 --用爱铸就经典
  2. 项目实例---随机森林在Kaggle实例:Titanic中的应用(一)
  3. drf路由组件Routers
  4. 仓库软件可以管理仓库,这么简单!
  5. TI Davinci 五年七宗罪
  6. 客户体验和营销:您需要了解的 5 个最佳实践
  7. 自动控制原理7.7---离散系统的数字校正
  8. 【沃顿商学院学习笔记】宏观经济学——11全球治理Global Governance
  9. jar包冲突java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException
  10. 农历php,PHP阴历转农历的实现代码