值得收藏的<冒泡排序>讲解
Posted 神的孩子都在歌唱
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了值得收藏的<冒泡排序>讲解相关的知识,希望对你有一定的参考价值。
前言:
作者:神的孩子在歌唱
大家好,我叫运智
一. 冒泡排序
冒泡排序也叫做起泡排序
执行流程
-
从头开始比较每一对相邻元素,如果第1个比第2个大,就交换它们的位置,执行完一轮后,最末尾那个元素就是最大的元素
-
忽略第一步中曾经找到的最大元素,重复执行步骤第一步,直到全部元素有序
代码介绍
- 第一层遍历:将最大的数遍历到最后面
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+",");
}
}
输出:
- 完整代码
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,2,3,6}已经排序好了,那我们只需遍历第一遍判断一下就可以了,最外面的大循环不用了
- 如果序列尾部已经局部有序,可以记录最后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;
}
二. 小知识扩展
排序算法稳定性
- 如果相等的2个元素,在排序前后的相对位置保持不变,那么这是稳定的排序算法
- 排序前:2,
1a
,4,1b
,5 - 稳定的排序:
1a,1b
,2,4,5 - 不稳定的排序:
1b,1a
,2,4,5
-
对自定义对象进行排序时,稳定性会影响最终的排序效果
-
冒泡排序属于稳定的排序算法,因为只有右边比左边大的时候才会交换。如果加上等于号
array[begin]<=array[begin-1]
那么就变成不稳定了,因为值相等也会交换。
原地算法(In-place Algorithm)
- 何为原地算法?
- 不依赖额外的资源或者依赖少数的额外资源(看空间复杂度),仅依靠输出来覆盖输入
- 空间复杂度为
𝑂(1)
的都可以认为是原地算法
-
非原地算法,称为 Not-in-place 或者 Out-of-place
-
冒泡排序属于原地算法( In-place)
本人csdn博客:https://blog.csdn.net/weixin_46654114
转载说明:跟我说明,务必注明来源,附带本人博客连接。
以上是关于值得收藏的<冒泡排序>讲解的主要内容,如果未能解决你的问题,请参考以下文章