排序算法-冒泡排序

本文详细介绍了冒泡排序的基本概念,包括其工作原理、核心代码实现以及优化策略。通过实例演示了如何利用标志位优化算法,使其在排序已完成时提前终止。适合初学者理解简单排序算法的工作方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

冒泡排序(Bubble Sort)

冒泡排序是一种比较简单的排序算法,是较基础的比较类交换排序,也是一种稳定排序算法。每个元素都可以看成一个“小气泡”,通过根据自身大小一点一点的移动到数列的顶端(升序或降序排列)达到排序的效果。

算法原理:

1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。

2、对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这样情况下,最后的元素应该会是最大的数。

3、针对所有的元素重复以上的步骤,除了最后一个。

4、持续每次对越来越少的元素重复步骤1~3,直到没有任何一对数字需要比较(排序完成)。

注:实质上就是依次比较相邻元素的大小,“升序”就是把小(大)的元素往前(后)调,“降序”就是把小(大)的元素往后(前)调。

例子引入:假设待排序序列为:[ 9 , 1 , 5 , 3 , 7 ],若采用冒泡排序对其进行升序(由小到大)排序,排序过程如下所示:

100c5e9f5345464b967a4f041b77d1ab.png

核心代码实现如下:

public void bubbleSort(int[] arr){  //例子中[9,1,5,3,7]
    for(int j = 0; j < arr.length-1; j++){
        for(int i = 0; i < arr.length-1-j; i++){
            System.out.print("比较"+ (i+1) +"次:"+ arr[i] +","+ arr[i+1]+";");
            if(arr[i] > arr[i+1]){
                int temp = arr[i];
                arr[i] = arr[i+1];
                arr[i+1] = temp;
            }
        }
        System.out.println("==>第"+ (j+1) +"趟排序(j="+j+"):"+ Arrays.toString(arr));
    }
    System.out.println("==>冒泡排序完成后结果为"+ Arrays.toString(arr));
}

/*输出结果为:
 * 比较1次:9,1;比较2次:9,5;比较3次:9,3;比较4次:9,7;==>第1趟排序(j=0):[1, 5, 3, 7, 9]
 * 比较1次:1,5;比较2次:5,3;比较3次:5,7;==>第2趟排序(j=1):[1, 3, 5, 7, 9]
 * 比较1次:1,3;比较2次:3,5;==>第3趟排序(j=2):[1, 3, 5, 7, 9]
 * 比较1次:1,3;==>第4趟排序(j=3):[1, 3, 5, 7, 9]
 * ==>冒泡排序完成后结果为[1, 3, 5, 7, 9]
 */   

 注意:在上述代码结果中,我们可以看出,其实在第2趟的时候就已经完成了排序,但是代码并不知道排序已经完成,还是会继续执行下一趟排序。这时,我们可以进行优化,设置一个标志位flag进行判别。

首先,在每一趟开始之前,初始化flag的值为false,如果两个元素比较后需要交换时,就将flag更改为true。所以某一趟情况下,如果发生交换,则flag=true,程序会顺利进入下一趟排序。但是如果没有发生交换,flag的值仍为false,即flag=false证明本趟已排序完成,即可return跳出循环。

代码优化如下:

public void bubbleSort(int[] arr){  //例子中[9,1,5,3,7]
    for(int j = 0; j < arr.length-1; j++){
        flag=false;//标志位初值为false
        for(int i = 0; i < arr.length-1-j; i++){
            if(arr[i] > arr[i+1]){
                int temp = arr[i];
                arr[i] = arr[i+1];
                arr[i+1] = temp;
                flag=true;//当发生交换,修改为true
            }
        }
        System.out.println("==>第"+ (j+1) +"趟排序(j="+j+"):"+ Arrays.toString(arr));
        if(!flag){//一趟排序后flag值仍为false
            System.out.println("==>冒泡排序完成后结果为"+ Arrays.toString(arr));
            return;
        }
    }
    System.out.println("==>冒泡排序完成后结果为"+ Arrays.toString(arr));
}

/*输出结果为:
 * ==>第1趟排序(j=0):[1, 5, 3, 7, 9]
 * ==>第2趟排序(j=1):[1, 3, 5, 7, 9]
 * ==>第3趟排序(j=2):[1, 3, 5, 7, 9]
 * ==>冒泡排序完成后结果为[1, 3, 5, 7, 9]
 * */

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值