冒泡排序

冒泡排序就是比较任何两个相邻的项,如果第一个比第二个大,则交换它们。元素项向上移动至正确的顺序,就好像气泡上升至表面一样,冒泡排序因此得名。

冒泡排序实现:

function bubbleSort(array){
    var length = array.length;
    for (var i = 0; i < length; i++) {            //控制数组经过了多少轮排序
        for (var j = 0; j < length - 1; j++) {      //进行了当前项和下一项的比较
            if (array[j] > array[j + 1]) {
                swap(array, j, j + 1)
            }
        }
    }
};

function swap (array, index1, index2) {
    var aux = array[index1];
    array[index1] = array[index2];
    array[index2] = aux;

    //ES6写法
    [array[index1], array[index2]] = [array[index2], array[index1]];
}

我们可以看到外层的循环主要是控制了数组中经过了多少轮循环(数组中的,每一项都经过一轮,轮数和数组的长度是一致的)。然后内循环将从第一位迭代到倒数第二位,内循环实际上进行当前项与下一项的比较,如果当前项比下一项大,则交换它们。

我们还可以发现当外循环完成一轮,最后一项就已经在正确的位置(即为最大项),然而在后续的循环中,还一直进行着比较,所以我们可以改进一下

思路:

如果内循环减去外循环的轮数,就可以避免内循环中所有不必要的比较
function modifiedBubbleSort() {
    var length = array.length;
    for (var i = 0; i < length; i++) {
        for (var j = 0; j < length - 1 - i; j++) {
            if (array[j] > array[j + 1]) {
                swap(array, j, j + 1)
            }
        }
    }
}