问题描述:
输入: 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²)。