一. 算法思想与伪代码
插入排序是一种较简单的排序算法,其工作方式像排序扑克牌一样。开始时左手为空且桌子上牌面向下。然后,每次从桌子上拿走一张牌并将其插入左手中正确的位置。为了找到一张牌的正确位置,我们从右到左将它与手中的每张牌进行比较。拿在左手上的牌总是排序好的。将排序过程命名为INSERTION-SORT,类比这个思路,可以得出插入排序的伪代码:
INSERTION-SORT(A):
for j = 2 to A.length
key = A[j]
// 将A[j]插入到已排序的序列A[1..j-1]中
i = j - 1
while i > 0 and A[i] > key
A[i +1] = A[i]
i = i - 1
A[i + 1] = key
二. 算法分析
根据其伪代码可以看出,排序过程实际是一个双层嵌套循环。这种双层嵌套循环的排序算法,在所有排序算法中的效率算是比较低的。实际的时间复杂度与输入序列是否已排好序有关:
1. 若输入序列是已排序的,则出现最佳情况,时间复杂度为O(n)
2. 若输入序列是已反向排序的,则出现最坏情况,时间复杂度为O(n2),即O(n的平方)
3. 平均时间复杂度也是O(n2)
三. 算法的JavaScript实现
根据上述伪代码,可以很容易地使用JavaScript实现。伪代码中认为序列的初始下标为1,而JavaScript中数组的初始下标为0,应注意区分。代码清单如下:
function insertSort(arr) {
var j, i, key;
for (j = 1; j < arr.length; j++) {
key = arr[j];
i = j - 1;
while (i > -1 && arr[i] > key) {
arr[i + 1] = arr[i];
i = i - 1;
}
arr[i + 1] = key;
}
}