冒泡排序

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

实现:

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中止循环... 因此能节省不必要的循环。

posted @ 2020-03-22 12:26  沐浴点阳光  阅读(207)  评论(0编辑  收藏  举报