之所以标题加上"(直接)"的字眼, 是因为有许多时间复杂度为更低的算法都是对这个最原始/直接的插入排序算法优化演变出来的. 所以他们也可以算是插入排序. 当然, 这里我们要说的是最原始最直接的插入排序.
插入排序: O(n ^ 2)
for (i = 1; i < n; i++) //从1到n-1, 往前面插
{
temp = a[i]; //要插入的值为a[i]
for (j = i; j > 0; j--); //从a[i-1]开始依次往前比较
{
if (temp >= a[j-1]))
{
break;
}
}
if (j < i) //则a[j]的位置就是a[i]需要插入的地方, a[j]...a[i-1]先依次往后移
{
for (k = i; k > j; k--)
{
a[k] = a[k-1]
}
a[j] = temp;
}
}
看了眼标准的算法实现, 发现丑爆了, 而且确实麻烦了, 没必要先找出位置,
再移动. 可以一边找就一边移动了, 就不用费二遍事了.
遂改成了下面这样..
for (i = 1; i < n; i++) //从1到n-1, 往前面插
{
temp = a[i]; //要插入的值为a[i]
for (j = i - 1; (j >= 0) && (temp < a[j]); j--) //从a[i-1]开始依次往前比较
{
swap(temp, a[j]);
}
}
仔细和标准的算法实现对比了下, 发现这种实现像冒泡, 不是插入..效率上来说一个swap是三个语句, 效率确实还是低
for (i = 1; i < n; i++) //从1到n-1, 往前面插
{
temp = a[i]; //要插入的值为a[i]
for (j = i; (j > 0) && (temp < a[j-1]); j--) //如果temp比a[j-1]小, 则a[j-1]的值向后移动一个单位.
{
a[j] = a[j-1];
}
a[j] = temp;
}