冒泡排序

        人们开始学习排序算法时,通常都先学冒泡算法,因为它在所有排序算法中最简单。然而,从运行时间的角度来看,冒泡排序是最差的一个,接下来你会知晓原因。

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

让我们来实现一下冒泡排序:

this.bubbleSort = function(){

    var length = array.length; //{1}

    for (var i=0; i

        for (var j=0; j

            if (array[j] > array[j+1]){ //{4}

                swap(array, j, j+1); //{5}

            }

        }

    }

};


        首先,声明一个名为 length 的变量,用来存储数组的长度(行 {1} )。这一步可选,它能帮助我们在行 {2} 和行 {3} 时直接使用数组的长度。接着,外循环(行 {2} )会从数组的第一位迭代至最后一位,它控制了在数组中经过多少轮排序(应该是数组中每项都经过一轮,轮数和数组长度一致)。然后,内循环将从第一位迭代至倒数第二位,内循环实际上进行当前项和下一项的比较(行 {4} )。如果这两项顺序不对(当前项比下一项大),则交换它们(行 {5} ),意思是位置为j+1 的值将会被换置到位置 j 处,反之亦然。

        现在我们得声明 swap 函数(一个私有函数,只能用在 ArrayList 类的内部代码中):

var swap = function(array, index1, index2){

    var aux = array[index1];

    array[index1] = array[index2];

    array[index2] = aux;

};

        交换时,我们用一个中间值来存储某一交换项的值。其他排序法也会用到这个方法,因此我们声明一个方法放置这段交换代码以便重用。

        如果使用在第1章学过的ES6(ECMAScript 2015)增强的对象属性,这个函数可以写成下面这样:

   [array[index1], array[index2]] = [array[index2], array[index1]];

        下面这个示意图展示了冒泡排序的工作过程:


        该示意图中每一小段表示外循环的一轮(行 {2} ),而相邻两项的比较则是在内循环中进行的(行 {3} )。

        我们将使用下面这段代码来测试冒泡排序算法,看结果是否和示意图所示一致:

function createNonSortedArray(size){ //{6}

    var array = new ArrayList();

    for (var i = size; i> 0; i--){

        array.insert(i);

    }

    return array;

}

var array = createNonSortedArray(5); //{7}

console.log(array.toString()); //{8}

array.bubbleSort(); //{9}

console.log(array.toString()); //{10}

        为了辅助测试本章将要学习的排序算法,我们将创建一个函数来自动地创建一个未排序的数组,数组的长度由函数参数指定(行 {6} )。如果传递 5 作为参数,该函数会创建如下数组: [5, 4,3, 2, 1] 。调用这个函数并将返回值存储在一个变量中,该变量将包含这个以某些数字来初始化的 ArrayList 类实例(行 {7} )。我们在控制台上输出这个数组内容,确保这是一个未排序数组(行 {8} ),接着我们调用冒泡排序方法(行 {9} )并再次在控制台上输出数组内容以验证数组已被排序了(行 {10} )。

        注意当算法执行外循环的第二轮的时候,数字4和5已经是正确排序的了。尽管如此,在后续比较中,它们还一直在进行着比较,即使这是不必要的。因此,我们可以稍稍改进一下冒泡排序算法。

        改进后的冒泡排序

        如果从内循环减去外循环中已跑过的轮数,就可以避免内循环中所有不必要的比较(行 {1} )

this.modifiedBubbleSort = function(){

    var length = array.length;

    for (var i=0; i

        for (var j=0; j

            if (array[j] > array[j+1]){

                swap(j, j+1);

            }

        }

    }

};

        下面这个示意图展示了改进后的冒泡排序算法是如何执行的:


你可能感兴趣的:(冒泡排序)