先貼一段簡單插入排序的代碼:
void insertion_sort(int* p, int n)
{
int i, k, j;
for(i=1; i<n; ++i)
{
k = p[i];
j = i-1;
while(j>=0 && p[j] > p[i])
{
p[j+1] = p[j];
--j;
}
p[j+1] = k;
}
}
編譯運行一看,錯了, 結果不對啊。 可是仔細分析, 好像也沒有錯啊。 奇怪了。
再貼一段代碼:
void insertion_sort(int* p, int n)
{
int i, k, j;
for(i=1; i<n; ++i)
{
k = p[i];
j = i-1;
while(j>=0 && p[j] > k) // 注意這裏的區別
{
p[j+1] = p[j];
--j;
}
p[j+1] = k;
}
}
編譯運行一看, 這次排序結果是對的。兩個代碼片段唯一不同的地方在while語句裏面, 一個是p[j > p[i], 一個是p[j] > k, 但是 k = p[i],粗略一看, 邏輯一樣啊,爲什麼上面運行不對, 下面代碼運行正確, 這不科學啊。
思索N久, 沒有結果。先記錄下來,過兩天再仔細考慮, 或者彙編看看。