冒泡排序

冒泡排序

冒泡排序(Bubble Sort)的基本思想是:通过对待排序数组从头到尾遍历(从索引较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从数组头部移向尾部,就象水底下的气泡一样逐渐向上冒。

算法步骤

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素重复第一步,从开始第一对到结尾的最后一对。这步做完后,数组最后一个元素将会是数组中最大的元素。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

动图演示

冒泡排序_第1张图片

算法实现

for (int end = array.length - 1; end >= 0; end--) {
    for (int begin = 1; begin <= end; begin++) {
        if(cmp(begin - 1, begin) > 0) {
            swap(begin - 1, begin);
        }
    }
}

算法优化

在排序的过程中,如果一趟比较下来没有进行过交换,就说明数组中的元素本来就是有序的,因此可以在排序过程中设置一个标志位来判断元素是否进行过交换,如果没有交换过,可以提前结束排序。

for (int end = array.length - 1; end >= 0; end--) {
    boolean isSorted = true;
    for (int begin = 1; begin <= end; begin++) {
        if(cmp(begin - 1, begin) > 0) {
            swap(begin - 1, begin);
            isSorted = false;
        }
    }
    if(isSorted) {
        break;
    }
}

进一步优化

要进行排序的数组是有序的可能性比较小,但是数组尾部如果已经局部有序,可以记录最后1次交换的位置,减少比较次数。

例如数组7 5 3 1 8 9 10,一轮排序后最后一次交换的位置为3,也就是位置3前面没有比位置3后面大的元素,下一轮排序只需要比较位置3前面的元素即可。

for (int end = array.length - 1; end >= 0; end--) {
    int lastSwapIndex = 0;
    for (int begin = 1; begin <= end; begin++) {
        if(cmp(begin - 1, begin) > 0) {
            swap(begin - 1, begin);
            lastSwapIndex = begin;
        }
    }
    end = lastSwapIndex;
}

冒泡排序的平均、最坏时间复杂度为O(n^2),最好时间复杂度为O(n),空间复杂度为O(1),是一个稳定排序算法。

稳定性

如果相等的2个元素,在排序前后的相对位置保持不变,那么这个排序算法是一个稳定的排序算法。

  • 排序前:5, 1, 3*, 4, 7, 3
  • 稳定的排序:1, 3*, 3 , 4, 5, 7
  • 不稳定的排序:1, 3, 3*, 4, 5, 7

对自定义对象进行排序时,稳定性会影响最终的排序效果。例如要排序的内容是一组原本按照价格高低排序的对象,如今需要按照销量高低排序,使用稳定性算法,可以使得相同销量的对象依旧保持着价格高低的排序展现,只有销量不同的才会重新排序。

稍有不慎,稳定的排序算法也能被写成不稳定的排序算法,比如下面的冒泡排序代码是不稳定的:

for (int end = array.length - 1; end >= 0; end--) {
    for (int begin = 1; begin <= end; begin++) {
        if(cmp(begin - 1, begin) >= 0) {
            swap(begin - 1, begin);
        }
    }
}

与上面稳定排序的冒泡排序的区别只在于将cmp(begin - 1, begin) > 0换成了cmp(begin - 1, begin) >= 0

原地算法(In-place Algorithm)

原地算法:不依赖额外的资源或者依赖少数的额外资源,仅依靠输出来覆盖输入。空间复杂度为O(1)的都可以认为是原地算法。

非原地算法,称为Not-in-place或者Out-of-place。

更多精彩内容关注本人公众号:架构师升级之路
冒泡排序_第2张图片

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