什么是冒泡排序?

冒泡排序的英文是bubble sort,是一种基础的交换排序,其核心思想是:比较相邻两个元素的大小,当一个元素大于它右侧相邻的元素时,就交换它们的位置,当小于时,则不交换位置。

特性:

  • 冒泡排序是一种稳定的排序,值相等的元素并不会打乱原本的顺序。
  • 时间复杂度:由于冒泡排序算法的每一轮都要遍历所有元素,总共遍历(元素数量-1)轮次,所以平均的时间复杂度是O(n^2)。

代码实现:

public static void bubble_sort(int[] array) {
    for(int i =0;i<array.length-1;i++) {
        for(int j = i+1;j<array.length;j++) {
            if(array[i]>array[j]) {
                int temp = array[i];
                array[i]=array[j];
                array[j]= temp;
            }
        }
    }    
}

*

冒泡排序的优化

原始冒泡排序的问题:

比如有一组数{5,8,6,3,9,2,1,7}在进行到第六轮冒泡排序之后,整个数组中的数字已经是排好序了,但是在原始的冒泡排序中,他还会继续进行第七轮比较,很显然这是没有必要的。

改进1.0

鉴于原始冒泡排序有以上的问题存在,所以我们对其进行优化,也就是如果我们能在第6论比较之后判断出数组已经是有序的,并且标记下来,这样剩下的几轮排序就不必执行了,可以提前结束工作。

代码实现

public static void bubble_sort1(int[] array) {
    for(int i = 0;i<array.length-1;i++) {
        //有序标记
        boolean isSorted = true;
        for(int j = i;j<array.length;j++) {
            if(array[i]>array[j]) {
                int temp = array[i];
                array[i] = array[j];
                array[j] = temp;
                //有元素交换,说明是无序的,设置为false
                isSorted = false;
            }
        }
        if(isSorted) {
            break;
        }
    }
}

*

继续优化

问题描述

在之气版本的冒泡排序中,虽然进行了一定的优化,但还是可以更进一步优化的。因为可能存在这样的一种情况,就是比如待排序数组是{3,4,2,1,5,6,7,8},我们可以看到这组书中后面的{5,6,7,8}已经是有序的了,我们就没有必要再把他们执行冒泡排序了,因此我们可以针对这种情况进行改进。

改进2.0

这种问题的关键点在于我们对数列有序区的界定。按照现有逻辑,有序区的长度和冒泡排序的轮数相等,但实际上可能有序区的长度要大于轮数。例如问题描述中的例子,后面的5,6,7,8实际已经处在有序区了。我们可以在每一轮排序之后,记录下来最后一个交换元素的位置,这个位置就是无序数列的边界,再往后就是有序数了。

代码实现

public static void bubble_sort2(int []array) {
    int lastChangeIndex=0;//记录最后一次交换位置
    int sortBolder = array.length-1;//无序区边界,每次比较到这儿就不用比较了
    for(int i = 0;i<array.length-1;i++) {
        //有序标记,每一轮初始值都是true
        boolean isSorted = true;
        
        for(int j = 0;j<sortBolder;j++) {
            if(array[j]>array[j+1]) {
                int temp = array[j];
                array[j] = array[j+1];
                array[j+1] = temp;
                
                //因为有元素交换,所以是无序的,设置为false
                isSorted = false;
                lastChangeIndex = j;
            }
        }
        sortBolder = lastChangeIndex;
        if(isSorted) {
            break;
        }
    }
}

*


夜雨声烦
7 声望1 粉丝

一个菜鸟,主要记录一下自己复习的东西