for(i=1;i
{
t=a[i];
for( j=i-1 ; j>=0 && t>a[j] ; j-- ) //內層
a[j+1]=a[j];
a[j+1]=t;
}
你要理解插入排序的原理,外層for從第二個數開始遍歷(i從1開始),用t(即對應的a[i])和其前面的所有值進行比較,如果t大,則該數後移一位,直到t小或者j小於0的時候退出內層for迴圈,這時候出現的格局就是所有在i位置之前比a[i]小的值全部後移了一位,退出迴圈時就會空出一個位置來。舉個例子:輸入:1 3 2 4
第一次迴圈時,t=a[1]=3,t>a[0],所以a[0]後移一位(即:a[j+1]=a[j] -> a[1]=a[0]),之後出現結果:1124,這時候實際上0位置是給此時的t預留的位置,內層for執行完畢後,執行:a[j+1]=t 正好彌補這個空缺。結果:3124
第二次迴圈時,j=1,t=a[2]=2,t>a[1],所以a[1]後移一位:a[2]=a[1],之後結果:3114,在比較t和a[0],t小,跳出內層for,跳出時j為0,執行:a[1]=t=2,結果:3214
下面就不講了,從上面可以看出,你說的那一句,至關重要,外層for每迴圈一次就插入一位資料,而a[j+1]=t,就是完成插入的最後一步。。
for(i=1;i
{
t=a[i];
for( j=i-1 ; j>=0 && t>a[j] ; j-- ) //內層
a[j+1]=a[j];
a[j+1]=t;
}
你要理解插入排序的原理,外層for從第二個數開始遍歷(i從1開始),用t(即對應的a[i])和其前面的所有值進行比較,如果t大,則該數後移一位,直到t小或者j小於0的時候退出內層for迴圈,這時候出現的格局就是所有在i位置之前比a[i]小的值全部後移了一位,退出迴圈時就會空出一個位置來。舉個例子:輸入:1 3 2 4
第一次迴圈時,t=a[1]=3,t>a[0],所以a[0]後移一位(即:a[j+1]=a[j] -> a[1]=a[0]),之後出現結果:1124,這時候實際上0位置是給此時的t預留的位置,內層for執行完畢後,執行:a[j+1]=t 正好彌補這個空缺。結果:3124
第二次迴圈時,j=1,t=a[2]=2,t>a[1],所以a[1]後移一位:a[2]=a[1],之後結果:3114,在比較t和a[0],t小,跳出內層for,跳出時j為0,執行:a[1]=t=2,結果:3214
下面就不講了,從上面可以看出,你說的那一句,至關重要,外層for每迴圈一次就插入一位資料,而a[j+1]=t,就是完成插入的最後一步。。