排序算法--------冒泡排序

1.什么是冒泡排序?

为什么这个排序要叫冒泡呢?为什么不叫其他名词呢?其实这个取名是根据排序算法的基本思路命名的,见名知意,冒泡排序,就是像泡泡在水里一样,在水里大的泡泡先浮出水面,就是大的先排出来,最小的最慢排出。

2.算法实现思想

  1. 比较两个相邻的数,如果前面的数大于后面的数,则将这两个数交换位置。第一次遍历后,最大的数会被放到数组的最后位置,即array[length - 1]。
  2. 第二次遍历时跳过最后一个元素,因为该元素通过第一次遍历已经确定是最大值。
  3. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

3.图解思想

在这里插入图片描述

图中浅蓝色的柱子为还未在正确位置的数,绿色的两个柱子为正在比较的数,橘黄色的柱子为已经在正确位置的数。

4.java实现

基本实现方法:

public class BubbleSort {
    public static void main(String[] args) {
        int[] arrInt={3,44,38,5,47,15,36,26,27,2,46,4,19,50,48};
        System.out.println("排序之前:");
        for (int i : arrInt) {
            System.out.print(i+" ");
        }
        System.out.println("\t");
        System.out.println("排序之后:");
        for (int i : bubbleSort(arrInt)) {
            System.out.print(i+" ");
        }
    }
    private static int[] bubbleSort(int[] arr){
        int temp;
        for (int i = 0; i < arr.length-1; i++) {
            for (int j = 0; j < arr.length - 1 - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
        return arr;
    }
}

运行结果:
在这里插入图片描述

5.算法复杂度分析:

5.1 时间复杂度

在设置标志变量之后:

当原始序列“正序”排列时,冒泡排序总的比较次数为n-1,移动次数为0,也就是说冒泡排序在最好情况下的时间复杂度为O(n);

当原始序列“逆序”排序时,冒泡排序总的比较次数为n(n-1)/2,移动次数为3n(n-1)/2次,所以冒泡排序在最坏情况下的时间复杂度为O(n^2);

当原始序列杂乱无序时,冒泡排序的平均时间复杂度为O(n^2)

5.2 空间复杂度

冒泡排序排序过程中需要一个临时变量进行两两交换,所需要的额外空间为1,因此空间复杂度为O(1)

5.3 稳定性

冒泡排序在排序过程中,元素两两交换时,相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法

一点补充:

冒泡排序早在 1956 年就有人开始研究,之后有很多人都尝试过对冒泡排序进行改进,但结果却令人失望。如 Knuth(Donald E. Knuth 中文名为高德纳,1974 年图灵奖获得者)所说:“冒泡排序除了它迷人的名字和导致了某些有趣的理论问题这一事实之外,似乎没有什么值得推荐的。

版权声明:本博客为记录本人自学感悟,转载需注明出处!
https://me.csdn.net/qq_39657909

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页