冒泡排序

Posted garfieldzhong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了冒泡排序相关的知识,希望对你有一定的参考价值。

冒泡排序:是指重复访问要排序的元素列,依次比较相临的两个元素,如果他们的顺序不是想要的顺序就把它们互换。

实现:

function bubbleSort(arr) {
    var len = arr.length;
    for(var i = 0; i < len; i++) {
        var jLen = len - 1 - i; 
        for(var (j = 0; j < jLen; j++)  {
           if (arr[j] > arr[j+1]) {
              var temp = arr[j+1];
              arr[j+1] = arr[j];
              arr[j] = temp;
            }
        }
    } 
    return arr;
}

es6:

function bubbleSort(arr) {
    const Len = arr.length;
    for (let i = 0; i < Len; i++) {
        const jLen = Len - 1 - i;
        for (let j = 0; j < jLen; j++) {
            if (arr[j] > arr[j+1]) {
                [arr[j+1], arr[j]] = [arr[j], arr[j+1]];
            }
        }
         
    }
    return arr;
}  

let arr = [9, 4, 5, 6, 2, 1, 3];
bubbleSort(arr) // => [1, 2, 3, 4, 5, 6, 9];

大功告成...

但是,仔细想想总感觉有点不太对~  如果原始数组为 arr = [1, 2, 3, 4, 5, 6, 9] 会怎么样?

这是一个原本就正确的排序,无须再冒泡~ 但是,此方法依然会进行依次遍历~ 那有没有办法改进呢?

function bubbleSort(arr) {
    const Len = arr.length;
    for (let i = 0; i < Len; i++) {
       let flag = true; // 立标签,标记是否需要再执行循环
        const jLen = Len - 1 - i;
        for (let j = 0; j < jLen; j++) {
            if (arr[j] > arr[j+1]) {
                [arr[j+1], arr[j]] = [arr[j], arr[j+1]];
                flag = false;
            }
        }
       if (flag) {
            break;
       }
         
    }
    return arr;
}  

通过定义一个flag,来确定哪一轮中可以确定排序完毕, 如果某一轮的所有次比较都没有进行交换操作(就是没有再进入if语句),说明排序完毕;因此flag仍为true, 为true则 break中止循环... 因此能节省不必要的循环。

以上是关于冒泡排序的主要内容,如果未能解决你的问题,请参考以下文章

java冒泡排序法代码

python代码实现鸡尾酒排序(双向冒泡排序)

冒泡排序python代码

视频+图文+动画详解冒泡排序

交换排序(冒泡排序快速排序的算法思想及代码实现)

C语言冒泡排序。