1樓:假面
插入排序(insertion sort)
如果需要對一個小型陣列進行升序排列,那麼可以選用插入排序,插入排序可以用打牌時對摸起的牌根據牌的點數來對其進行插入排列來描述。
可以把左手中的牌比做已經摸起的牌,即已經被排列好的牌,左手可以容納的牌數的空間可以假想為和要摸的牌的總數相同;而在桌子上的那部分沒摸的牌則是未被排序的牌,這二者的關係可以抽象為陣列中已經被排序好的部分和未被排序好的部分。
一開始摸起的第一張牌不需要排序,可以認定其為已排序的牌。
如果用外層迴圈for來表示摸起的牌的話,則可以抽象為:
// 物件陣列
// 桌子上的牌
int a = ;
// 從陣列的第二個元素開始抽取
for(int i = 1; i < sizeof a/sizeof a[0]; ++i)
而後摸起的排要根據排列策略和先前摸起的牌的點數的大小來確定其插入的合適位置,這裡示範的排列策略是升序排列,摸起了這張牌後,便自右向左地和手中的牌進行比較。
把pick稱作摸起的牌,如果pick比手中的牌小,則手中較大的那張牌就向右挪一位,pick再和下一張牌做比較,如果下一張牌仍然比pick大,那麼那張牌便也向右移動一個位置,依此類推。
如果手中下一張和pick比較的牌比pick小,那麼pick就被插入在了手中前一張牌移動後空下的位置;
或者手中所有的牌都比pick大,那麼所有的牌就都向右移動過一個位置,所以pick最終被插入在了手中最左邊的位置。
這個過程可以抽象為:
// 物件陣列
// 桌子上的牌
int a = ;
// 從陣列的第二個元素開始抽取
for(int i = 1; i < sizeof a/sizeof a[0]; ++i)
// while結束後,j+1所表達的位置便是pick可以插入的位置
a[j+1] = pick;
}// 對於有n個元素的陣列a,採用插入排序法排序時,當外層迴圈進行了n-1次後排序完畢
2樓:匿名使用者
1. for( j=i-1 ; j>=0 && t>a[j] ; j-- )
a[j+1]=a[j];
表示將陣列中插入位置開始的數向後移動。
2. a[j+1]=t;是為了將值插入到需要插入的位置上,共有四個數因此需要在迴圈體
for(i=1;i<4;i++)中迴圈執行三次
3. for( j=i-1 ; j>=0 && t>a[j] ; j-- )的迴圈體只有a[j+1]=a[j];
a[j+1]=t; 不是for( j=i-1 ; j>=0 && t>a[j] ; j-- )的迴圈體。
3樓:瀚漠
for(i=1;i<4;i++) //外層
你要理解插入排序的原理,外層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,就是完成插入的最後一步。。
4樓:辛文琴元楓
關鍵字比大小,大的作為左子女,否則作為右子女,如此遞迴,就站好隊了。
二分法插入排序快速排序歸併排序堆排序的時間複雜度分別
二分法插入排序 複雜度 o nlogn 快速排序 o nlogn 有可能退化歸併排序 o nlogn 比較快堆排序 o nlogn 最穩定的 二分法插入排序 快速排序 歸併排序 堆排序 的時間複雜度分別是多少?二分法插入排序 複雜度 o nlogn 快速排序 o nlogn 有可能退化歸併排序 o ...
c語言中冒泡法排序數,c語言中冒泡法排序六個數
include int main c語言隨機產生50個數輸出,排序後再輸出 include include int main for int j 1 j 20 j for int i 1 i 20 i int temp if a i a i 1 temp a i a i 在c語言中怎樣表示一個數的 ...
關於VB的氣泡排序法,急,關於C語言氣泡排序法的問題
1 這個首先是 下標越界 吧,可以dim a 5 as integer 需要注意的是 你只用了5個元素,你沒用option base 1,所以下標從0開始的。2 其次是 型別不匹配 陣列的輸出要採用如下形式 for i 1 to ubound a print a i next i 你的a陣列沒有定義...