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

Posted 神的孩子都在歌唱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了值得收藏的<冒泡排序>讲解相关的知识,希望对你有一定的参考价值。

前言:

作者:神的孩子在歌唱

大家好,我叫运智

一. 冒泡排序

冒泡排序也叫做起泡排序

执行流程

  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+",");
    }
}

输出:

  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+",");
		}
			
	}
}

输出:

代码优化

  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

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

以上是关于值得收藏的<冒泡排序>讲解的主要内容,如果未能解决你的问题,请参考以下文章

值得收藏的<计数排序>讲解

JS常用代码片段2-值得收藏

JS常用代码片段2-值得收藏

面试必会排序算法java 实现冒泡排序讲解

JS常用代码片段-127个常用罗列-值得收藏

❤️五万字《十大排序算法》动图讲解❤️(建议收藏)