[排序算法]–冒泡排序的三种实现(Java)

[排序算法]–冒泡排序的三种实现(Java)冒泡排序是非常好理解的,以从小到大排序为例,每一轮排序就找出未排序序列中最大值放在最后。设数组的长度为N:(1)比较前后相邻的二个数据,如果前面数据大于后面的数据,就将这二个数据交换。(2)这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。(3)N=N-1,如果N不为0就重复前面二步,否则排序完成。以上就是冒泡排序的基本思想,按照这个定义很快就能写

大家好,又见面了,我是你们的朋友全栈君。

冒泡排序是非常好理解的,以从小到大排序为例,每一轮排序就找出未排序序列中最大值放在最后。

设数组的长度为N:
(1)比较前后相邻的二个数据,如果前面数据大于后面的数据,就将这二个数据交换。

(2)这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置。

(3)N=N-1,如果N不为0就重复前面二步,否则排序完成。

以上就是冒泡排序的基本思想,按照这个定义很快就能写出代码:

/** * 冒泡排序的第一种实现, 没有任何优化 * @param a * @param n */
public static void bubbleSort1(int [] a, int n){
    int i, j;

    for(i=0; i<n; i++){
  
  //表示n次排序过程。
        for(j=1; j<n-i; j++){
            if(a[j-1] > a[j]){
  
  //前面的数字大于后面的数字就交换
                //交换a[j-1]和a[j]
                int temp;
                temp = a[j-1];
                a[j-1] = a[j];
                a[j]=temp;
            }
        }
    }
}// end

给出一个测试代码:

public static void main(String[] args) {
    int[] arr = {
  
  1,1,2,0,9,3,12,7,8,3,4,65,22};

    BubbleSort.bubbleSort1(arr, arr.length);

    for(int i:arr){
        System.out.print(i+",");
    }
}

运行结果:

0,1,1,2,3,3,4,7,8,9,12,22,65,

下面开始考虑优化,如果对于一个本身有序的序列,或则序列后面一大部分都是有序的序列,上面的算法就会浪费很多的时间开销,这里设置一个标志flag,如果这一趟发生了交换,则为true,否则为false。明显如果有一趟没有发生交换,说明排序已经完成。

/** * 设置一个标志,如果这一趟发生了交换,则为true,否则为false。明显如果有一趟没有发生交换,说明排序已经完成。 * @param a * @param n */
public static void bubbleSort2(int [] a, int n){
    int j, k = n;
    boolean flag = true;//发生了交换就为true, 没发生就为false,第一次判断时必须标志位true。
    while (flag){
        flag=false;//每次开始排序前,都设置flag为未排序过
        for(j=1; j<k; j++){
            if(a[j-1] > a[j]){
  
  //前面的数字大于后面的数字就交换
                //交换a[j-1]和a[j]
                int temp;
                temp = a[j-1];
                a[j-1] = a[j];
                a[j]=temp;

                //表示交换过数据;
                flag = true;
            }
        }
        k--;//减小一次排序的尾边界
    }//end while
}//end

运行测试main函数结果:

0,1,1,2,3,3,4,7,8,9,12,22,65,

再进一步做优化。比如,现在有一个包含1000个数的数组,仅前面100个无序,后面900个都已排好序且都大于前面100个数字,那么在第一趟遍历后,最后发生交换的位置必定小于100,且这个位置之后的数据必定已经有序了,也就是这个位置以后的数据不需要再排序了,于是记录下这位置,第二次只要从数组头部遍历到这个位置就可以了。如果是对于上面的冒泡排序算法2来说,虽然也只排序100次,但是前面的100次排序每次都要对后面的900个数据进行比较,而对于现在的排序算法3,只需要有一次比较后面的900个数据,之后就会设置尾边界,保证后面的900个数据不再被排序。

public static void bubbleSort3(int [] a, int n){
    int j , k;
    int flag = n ;//flag来记录最后交换的位置,也就是排序的尾边界

    while (flag > 0){
  
  //排序未结束标志
        k = flag; //k 来记录遍历的尾边界
        flag = 0;

        for(j=1; j<k; j++){
            if(a[j-1] > a[j]){
  
  //前面的数字大于后面的数字就交换
                //交换a[j-1]和a[j]
                int temp;
                temp = a[j-1];
                a[j-1] = a[j];
                a[j]=temp;

                //表示交换过数据;
                flag = j;//记录最新的尾边界.
            }
        }
    }
}

这种方法是我看到的最优化的冒泡排序了。
运行测试例子结果:

0,1,1,2,3,3,4,7,8,9,12,22,65,

可知运行结果正确。

本文所有代码的github地址:
https://github.com/leetcode-hust/leetcode/blob/master/louyuting/src/leetcode/Algorithm/BubbleSort.java

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/152155.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • android蓝牙通讯开发(详细)「建议收藏」

    android蓝牙通讯开发(详细)「建议收藏」新建一个工程之后,我们可以先看到界面左边的项目栏,我们可以看到,除了app目录以外,大多数的文件和目录都是自动生成的,我们也不需要对他们进行修改,而app目录之下的文件才是我们工作的重点。下面,我先对

    2022年7月1日
    69
  • android 学生模式,(续上篇)多亲AI助手——学生模式体验小记

    android 学生模式,(续上篇)多亲AI助手——学生模式体验小记(续上篇)多亲AI助手——学生模式体验小记2019-08-1811:02:5617点赞9收藏14评论朋友的多亲2,是过了好几手的。哦,原来不是他的,那上次半推半就借给我,是几个意思?寄走前,他允许我再摸摸。正好,本人还有几个疑问,需要验证。本篇体验,以问答形式撰写,没有废话,都是干货。网红遥控器值不值得买——多亲AI助手体验小记由来“多亲AI助手”到手,来自一位朋友,过两天还要还回去,并非全新,…

    2022年6月10日
    156
  • 蒙特卡洛树搜索 MCTS 入门[通俗易懂]

    蒙特卡洛树搜索 MCTS 入门[通俗易懂]引言  你如果是第一次听到蒙特卡洛,可能会认为这是一个人名。那么你就大错特错,蒙特卡洛不是一个人名,而是一个地方,还一个赌场名!!!但是这不是我们的重点。  我们今天的主题就是入门蒙特卡洛树搜索,这个算法我个人觉得非常神奇也非常有意思。因为前几年AlphaGo就是借助蒙塔卡洛树搜索以及基于深度学习的的策略价值网络击败了人类冠军,赢得了胜利。而今天我们的主角就是蒙特卡洛树搜索它究竟是怎么实现的?它的原理?以及会举出一个例子来告诉大家整个算法的工作流程。一、什么是MCTS?  蒙特卡洛树搜索是一

    2022年6月15日
    120
  • TortoiseGit安装配置_tortoisegit使用详解

    TortoiseGit安装配置_tortoisegit使用详解1TortoiseGit简介tortoiseGit是一个开放的git版本控制系统的源客户端,支持Winxp/vista/win7.该软件功能和git一样不同的是:git是命令行操作模式,tort

    2022年8月3日
    6
  • stringutils.isnotblank()_String java

    stringutils.isnotblank()_String java今天在做SSM系统时候,为了进行查询特意使用StringUtils.isNotBlank(name)一定注意导入的包是:importorg.apache.commons.lang3.StringUtils;开始使用的是com.mysql.jdbc中的StringUtils.isNullOrEmpty,,,结果导致在我进行查询的时候各种错误,特地来此总结一番。StringUtils方法的

    2022年8月12日
    8
  • 浅谈 AnalyticDB SQL 优化「建议收藏」

    浅谈 AnalyticDB SQL 优化「建议收藏」数据库性能优化需要从多个方面进行综合考虑。例如系统资源是否充足、资源模型的设计(高性能vs大存储)、表的设计以及规划、SQL改写和优化等等,本文只要介绍ADBsql的优化。

    2025年12月5日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号