問題描述:
輸入: n個數的一個序列,[a1, a2 , a3, a4, ……, an ] 。
輸出:輸入序列的一個排序結果,[b1, b2 , b3, b4, …… ,bn ], 滿足 b1≤ b2 ≤ b3 · · · · ≤ bn 。
算法描述:
插入排序的工作 方式像許多人排序一手撲克牌,開始時,我們的左手爲空並且桌子上的牌面向下。 然後,我們每次從桌子上拿走一張牌並將它插入左手中正確的位置。第一次摸牌時只需將牌放入左手,之後每次摸牌時需要將摸到的牌與已在手中的每張牌進行比較,將其插入正確的位置。這樣預期的結果是左手上的牌總是排好序的。
代碼實現:
function insertionSort(arr)//方法三:插入排序
{
for (var i = 1; i <arr.length; i++) //從數組第二個數開始,往該元素的前邊插入
{
var Key = arr[i]; // key代表當前拿到的元素(要進行插入操作的數)
var j = i - 1;
while (j >= 0&& arr[j] > Key) {
arr[j + 1] =arr[j]; // 如果前邊的元素比key大,則依次往後移動
arr[j] = Key; //將key插入當前位置
j--; //從右往左逐個比較 }
}
}
return arr;
}
var arr=[5,2,4,6,1,3];
console.log(insertionSort(arr)) ; // [1, 2 , 3 , 4 , 5 ,6]
分析總結:
最好的情況是所有拿到的數值都已排好序,這樣我們只需遍歷一次就可以結束程序。這種情況下的算法複雜度爲O(n) 。 同時,存在着最壞的情況,拿到的數值是完全反向排序的,在這種情況下我們的算法複雜度是O(n²)。