之所以標題加上"(直接)"的字眼, 是因爲有許多時間複雜度爲更低的算法都是對這個最原始/直接的插入排序算法優化演變出來的. 所以他們也可以算是插入排序. 當然, 這裏我們要說的是最原始最直接的插入排序.
插入排序: 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;
}