????????選擇排序算法是一種原址比較排序算法。選擇排序大致的思路是找到數(shù)據(jù)結(jié)構(gòu)中的最小值并將其放置在第一位,接著找到第二小的值并將其放在第二位,以此類(lèi)推。
????????下面是選擇排序算法的源代碼:
this.selectionSort = function(){
????var length = array.length, indexMin; //{1}
????for (var i=0; i<length-1; i++){ //{2}
????????indexMin = i; //{3}
????????for (var j=i; j<length; j++){ //{4}
????????????if(array[indexMin]>array[j]){ //{5}
????????????????indexMin = j; //{6}
????????????}
????????}
????????if (i !== indexMin){ //{7}
????????swap(i, indexMin);
????????}
????}
};
????????首先聲明一些將在算法內(nèi)使用的變量(行 {1} )。接著,外循環(huán)(行 {2} )迭代數(shù)組,并控制迭代輪次(數(shù)組的第n個(gè)值——下一個(gè)最小值)。我們假設(shè)本迭代輪次的第一個(gè)值為數(shù)組最小值(行{3} )。然后,從當(dāng)前 i 的值開(kāi)始至數(shù)組結(jié)束(行 {4} ),我們比較是否位置 j 的值比當(dāng)前最小值小(行 {5} );如果是,則改變最小值至新最小值(行 {6} )。當(dāng)內(nèi)循環(huán)結(jié)束(行 {4} ),將得出數(shù)組第n小的值。最后,如果該最小值和原最小值不同(行 {7} ),則交換其值。
????????用以下代碼段來(lái)測(cè)試選擇排序算法:
array = createNonSortedArray(5);
console.log(array.toString());
array.selectionSort();
console.log(array.toString());
????????下面的示意圖展示了選擇排序算法,此例基于之前代碼中所用的數(shù)組。
????????數(shù)組底部的箭頭指示出當(dāng)前迭代輪尋找最小值的數(shù)組范圍(內(nèi)循環(huán) {4} ),示意圖中的每一步則表示外循環(huán)。
????????選擇排序同樣也是一個(gè)復(fù)雜度為O(n 2 )的算法。和冒泡排序一樣,它包含有嵌套的兩個(gè)循環(huán),這導(dǎo)致了二次方的復(fù)雜度。然而,接下來(lái)要學(xué)的插入排序比選擇排序性能要好。