值得收藏的<冒泡排序>讲解

本文详细介绍了冒泡排序的执行流程、代码实现及优化方法。通过示例代码展示了如何实现冒泡排序,并讨论了如何通过记录最后一次交换位置来提高效率。此外,还解释了排序算法的稳定性以及冒泡排序作为原地算法的特点。

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

前言:

作者:神的孩子在歌唱

大家好,我叫运智

一. 冒泡排序

冒泡排序也叫做起泡排序

执行流程

  1. 从头开始比较每一对相邻元素,如果第1个比第2个大,就交换它们的位置,执行完一轮后,最末尾那个元素就是最大的元素

  2. 忽略第一步中曾经找到的最大元素,重复执行步骤第一步,直到全部元素有序

代码介绍
  1. 第一层遍历:将最大的数遍历到最后面
public static void main(String[] args) {
    int[] array= {3,44,38,5,47,15,36};
    for(int begin=1;begin<array.length;begin++) {
        //			如果后面的数小于前面的数就交换
        if (array[begin]<array[begin-1]) {
            int temp=array[begin];
            //				将后面的数变成前面的数
            array[begin]=array[begin-1];
            //				前面的数变成后面的数
            array[begin-1]=temp;
        }
    }
    for(int c:array) {
        System.out.print(c+",");
    }
}

输出:image-20210824155306611

  1. 完整代码
package 冒泡;

public class _01_冒泡 {
	public static void main(String[] args) {
		int[] array= {3,44,38,5,47,15,36};
// 遍历完后将最后一个数排除继续遍历
		for(int end=array.length;end>0;end--) {
//			从前往后比较
			for(int begin=1;begin<end;begin++) {
	//			如果后面的数小于前面的数就交换
				if (array[begin]<array[begin-1]) {
					int temp=array[begin];
	//				将后面的数变成前面的数
					array[begin]=array[begin-1];
	//				前面的数变成后面的数
					array[begin-1]=temp;
				}
			}
		}
		for(int c:array) {
			System.out.print(c+",");
		}
			
	}
}

输出:image-20210824155830830

冒泡

代码优化
  1. 如果序列已经完全有序,可以提前终止冒泡排序

比如:{1,2,3,6}已经排序好了,那我们只需遍历第一遍判断一下就可以了,最外面的大循环不用了

在这里插入图片描述

  1. 如果序列尾部已经局部有序,可以记录最后1次交换的位置,减少比较次数

如果第一次遍历发现后面的数据不用交换,那么下次遍历可以跳过,比如{2,1,4,5,3,6,7,8},后面6,7,8已经排序好了,第二遍的时候不需要遍历6,7,8了,记录下最后交换位置是在3,将end变成3。所以我们记录每一轮扫描最后交换的位置(索引)

for(int end=array.length;end>0;end--) {

    //这个sortIndex初始值在数组完全有序的时候有用
    int sortIndex=1;
    //			从前往后比较
    for(int begin=1;begin<end;begin++) {
        //			如果后面的数小于前面的数就交换
        if (array[begin]<array[begin-1]) {
            int temp=array[begin];
            //				将后面的数变成前面的数
            array[begin]=array[begin-1];
            //				前面的数变成后面的数
            array[begin-1]=temp;
            //					记录最后一次交换的位置
            sortIndex=begin;
        }
    }
    end=sortIndex;
}

二. 小知识扩展

排序算法稳定性
  1. 如果相等的2个元素,在排序前后的相对位置保持不变,那么这是稳定的排序算法
  • 排序前:2,1a,4,1b,5
  • 稳定的排序: 1a,1b,2,4,5
  • 不稳定的排序:1b,1a,2,4,5
  1. 对自定义对象进行排序时,稳定性影响最终的排序效果

  2. 冒泡排序属于稳定的排序算法,因为只有右边比左边大的时候才会交换。如果加上等于号array[begin]<=array[begin-1]那么就变成不稳定了,因为相等也会交换。

原地算法(In-place Algorithm)
  1. 何为原地算法?
  • 不依赖额外的资源或者依赖少数的额外资源(看空间复杂度),仅依靠输出来覆盖输入
  • 空间复杂度为 𝑂(1) 的都可以认为是原地算法
  1. 非原地算法,称为 Not-in-place 或者 Out-of-place

  2. 冒泡排序属于原地算法( In-place)

本人csdn博客:https://blog.csdn.net/weixin_46654114

转载说明:跟我说明,务必注明来源,附带本人博客连接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

神的孩子都在歌唱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值