算法打卡Day28_冒泡排序

我想你了,可是我不能对你说,就像开满梨花的树上,永远不可能结出果。我想你了,可是我不能对你说,就像高挂天边的彩虹,永远无人能够触摸。我想你了,可是我不能对你说,就像火车的轨道,永远不会有轮船驶过。我想你了,可我,真的不能对你说。怕只怕,说了,对你,也是一种折磨。
算法打卡Day28_冒泡排序_第1张图片

冒泡排序

什么是冒泡排序呢?冒泡排序只会操作相邻的两个数据,每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小要求。如果不满足就让他们互换。一次冒泡会让至少一个元素移动到它应该在的位置。重复n次,就完成了n个数据的排序工作

案例

我们要对一组数据4,5,6,3,2,1,从小到到大进行排序。第一次冒泡操作的详细过程就是这样:
算法打卡Day28_冒泡排序_第2张图片

可以看出,经过一次冒泡操作之后,6这个元素已经存储在正确的位置上。要想完成所有数据的排序,我们只要进行6次这样的冒泡操作就行了。
算法打卡Day28_冒泡排序_第3张图片
实际上,刚讲的冒泡过程还可以优化。当某次冒泡操作已经没有数据交换时,说明已经达到完全有序,不用再继续执行后续的冒泡操作。

我这里还有另外一个例子,这里面给6个元素排序,只需要4次冒泡操作就可以了。
算法打卡Day28_冒泡排序_第4张图片

代码

package cn.study.sufa.Day27;

import java.util.Arrays;

/**
 * @PackageName: cn.study.sufa.Day27
 * @author: youjp
 * @create: 2022-05-15 20:50
 * @description: todo 冒泡排序
 * @Version: 1.0
 */
public class Solution {
    /**
     * 冒泡排序
     * @param a
     * @param n
     */
    public void sortInt(int a[],int n){
        if (n<=1) return ;
        int tem=0;
        for(int i=0;i<n;i++){
            //提前退出冒泡循环标志
            boolean flag= false;
            for (int j=0;j<a.length-i-1;j++){
                if(a[j]>a[j+1]){ //交换
                    tem =a[j];
                    a[j] =a[j+1];
                    a[j+1] =tem;
                    flag =true; //表示有数据交换
                }
            }
            if (!flag){
                break; //没有数据交换,直接退出循环
            }
        }
    }
    public static void main(String[] args) {
        int a[] ={24,21,3,5,99,88,90};
        //输出排序结果
        System.out.println("排序前"+Arrays.toString(a));
        new Solution().sortInt(a,7);
        //输出排序结果
        System.out.println("排序后"+Arrays.toString(a));
    }
}

输出结果
算法打卡Day28_冒泡排序_第5张图片

总结

1.冒泡排序是原地排序算法吗?
冒泡的过程只涉及相邻数据的交换操作,只需要常量级的临时空间,所以它的空间复杂度为O(1),是一个原地排序算法。
2.冒泡排序是稳定的排序算法吗?
在冒泡排序中,只有交换才可以改变两个元素的前后顺序。为了保证冒泡排序算法的稳定性,当有相邻的两个元素大小相等的时候,我们不做交换,相同大小的数据在排序前后不会改变顺序,所以冒泡排序是稳定的排序算法
3.冒泡排序的时间复杂度是多少?
最好情况下,要排序的数据已经是有序的了,我们只需要进行一次冒泡操作,就可以结束了,所以最好情况时间复杂度是O(n)。而最坏的情况是,要排序的数据刚好是倒序排列的,我们需要进行n次冒泡操作,所以最坏情况时间复杂度为O(n2)。
平均情况:
“有序度”和“逆序度”:对于一个不完全有序的数组,如4,5,6,3,2,1,有序元素对为3个(4,5),(4,6),(5,6),有序度为3,逆序度为12;
对于一个完全有序的数组,如1,2,3,4,5,6,有序度就是n*(n-1)/2,也就是15,称作满有序度逆序度=满有序度-有序度;冒泡排序、插入排序交换(或移动)次数=逆序度。
最好情况下初始有序度为n*(n-1)/2,最坏情况下初始有序度为0,则平均初始有序度为n*(n-1)/4,即交换次数为n*(n-1)/4,因交换次数<比较次数<最坏情况时间复杂度,所以平均时间复杂度为O(n^2)。

有兴趣的老爷,还可以关注我的公众号【一起收破烂】,回复【006】获取 最新java面试资料以及简历模型120套哦~
在这里插入图片描述

你可能感兴趣的:(算法每日进步,算法,排序算法,数据结构,冒泡排序)