????????插入排序每次排一個(gè)數(shù)組項(xiàng),以此方式構(gòu)建最后的排序數(shù)組。假定第一項(xiàng)已經(jīng)排序了,接著,它和第二項(xiàng)進(jìn)行比較,第二是應(yīng)該待在原位還是插到第一項(xiàng)之前呢?這樣,頭兩項(xiàng)就已正確排序,接著和第三項(xiàng)比較(它是該插入到第一、第二還是第三的位置呢?),以此類推。
????????下面這段代碼表示插入排序算法:
this.insertionSort = function(){
????var length = array.length,j, temp; ?//{1}
????for (var i=1; i<length; i++){ //{2}
????????j = i; //{3}
????????temp = array[i]; //{4}
????????while (j>0 && array[j-1] > temp){ //{5}
????????????array[j] = array[j-1]; //{6}
????????????j--;
????????}
????????array[j] = temp; //{7}
????}
};
????????照例,算法的第一行用來聲明代碼中使用的變量(行 {1} )。接著,迭代數(shù)組來給第i項(xiàng)找到正確的位置(行 {2} )。注意,算法是從第二個(gè)位置(索引 1 )而不是 0 位置開始的(我們認(rèn)為第一項(xiàng)已排序了)。然后,用 i 的值來初始化一個(gè)輔助變量(行 {3} )并將其值亦存儲(chǔ)于一臨時(shí)變量中(行 {4} ),便于之后將其插入到正確的位置上。下一步是要找到正確的位置來插入項(xiàng)目。只要變量 j 比 0 大(因?yàn)閿?shù)組的第一個(gè)索引是 0 ——沒有負(fù)值的索引)并且數(shù)組中前面的值比待比較的值大(行 {5} ),我們就把這個(gè)值移到當(dāng)前位置上(行 {6} )并減小 j 。最終,該項(xiàng)目能插入到正確的位置上。
????????下面的示意圖展示了一個(gè)插入排序的實(shí)例:
????????舉個(gè)例子,假定待排序數(shù)組是 [3, 5, 1, 4, 2] 。這些值將被插入排序算法按照下面形容的步驟進(jìn)行排序。
????????(1) 3已被排序,所以我們從數(shù)組第二個(gè)值5開始。3比5小,所以5待在原位(數(shù)組的第二位)。3和5排序完畢。
????????(2) 下一個(gè)待排序和插到正確位置上去的值是1(目前在數(shù)組的第三位)。5比1大,所以5被移至第三位去了。我們得分析1是否應(yīng)該被插入到第二位——1比3大嗎?不,所以3被移到第二位去了。接著,我們得證明1應(yīng)該插入到數(shù)組的第一位上。因?yàn)?是第一個(gè)位置且沒有負(fù)數(shù)位,所以1必須被插入到第一位。1、3、5三個(gè)數(shù)字已經(jīng)排序。
????????(3) 4應(yīng)該在當(dāng)前位置(索引3)還是要移動(dòng)到索引較低的位置上呢?4比5小,所以5移動(dòng)到索引3位置上去。那么應(yīng)該把4插到索引2的位置上去嗎?4要比3大,所以4插入到數(shù)組的位置3上。
????????(4) 下一個(gè)待插入的數(shù)字是2(數(shù)組的位置4)。5比2大,所以5移動(dòng)至索引4。4比2大,所以4也得移動(dòng)(位置3)。3也比2大,所以3還得移動(dòng)。1比2小,所以2插入到數(shù)組的第二位置上。至此,數(shù)組已排序完成。排序小型數(shù)組時(shí),此算法比選擇排序和冒泡排序性能要好。