資料結構 插入排序

2021-08-02 19:55:58 字數 1717 閱讀 6417

基本概念

排序: 使記錄按關鍵字遞增或遞減排列

關鍵字重複不影響記錄順序的排序稱為穩定排序;影響記錄順序的稱為不穩定排序。

僅在記憶體中進行的排序稱為內部排序;涉及內外存交換的排序稱為外部排序。

內部排序:插入排序、選擇排序、交換排序、歸併排序、分配排序。

排序演算法的步驟:

1、比較兩個關鍵字大小

2、改變指向記錄的指標或移動記錄本身的位置

1、插入排序

基本思想:每次將乙個待排序的記錄按其關鍵字大小插入到前面已經排好序的子檔案中的適當位置,知道全部記錄插入完成為止

1.1 直接插入排序

code:

void insertsort(seqlist r)

while(r[0].key < r[j].key)  //當前項的key>=排序項的key時結束比較

r[j+1] = r[0]; //插入當前項到排序位置}}

}基本思想:以第一項為有序區第乙個元素 拿第二個key跟第乙個key比較 小的話就把第乙個後移一位 把第二個插入到第乙個的位置;大於等於的話就繼續拿第三個跟已經排好的第一第二個從後往前比較 若第三項的key小於排好的第二項的key 則把已經排好的第二項後移一位 繼續拿第三項去比較已經排好的第一項 若第三項仍然小於排好的第一項 則第一項後移一位 第三項插入到第一項的位置;若第三項大於等於排好的第一項的key 則將第三項插入到第二項後移之後空出來的位置上;若第三項key大於等於已經排好的第二項的key 則插入到最後(阿彌陀佛 繞口令一般 也就自己能看懂。。。)

形象一點:打牌 抓牌的時候 每抓一張都會放到「你認為最合適的」地方,這個中間的思維過程就是插入排序。

1.2 希爾排序 (分組排序後再排序)

code:

void shellsort(seqlist r)

while(increment > 1); //=1時結束

}void shellpass(seqlist r,int d)

while(j > 0 && r[0].key < r[j].key);//當前記錄的key >= 前一位記錄的key時結束

r[j+d] = r[0]; //將當前記錄插入到正確的位置上}}

}基本思想:將記錄按某增量(步長)分組(跨增量位置的記錄歸為一組);然後對每組資料進行插入排序(因為每組的資料要比分組前少很多 所以相對比較快);對進行過第一次分組排序的資料再次按某遞減的增量(步長)進行分組(遞減不一定是減1 可以根據實際情況確定遞減多少);然後對第二次分組的記錄執行插入排序(因已經經過一次插入排序 所以每個分組相對來說順序比較整齊 所以迴圈次數相對較少);再次遞減增量(步長)重複上面的插入操作,知道步長為1結束插入排序。

這裡的步長選取沒有固定的規則,所以只能根據實際情況實際分析。希爾排序法是不穩定的(重複的值排序後順序可能與排序前順序不一樣)。

形象一點:全球分工協作 每人完成其中的一部分工作(例如製造、組裝等等) 乙個部門完成乙個零部件 乙個工廠完成乙個產品  多個工廠協作完成一批成品。

資料結構 插入排序

演算法中經常會用到各種各樣的演算法,比較簡答的思想就是氣泡排序,一般剛開始程式設計時遇到排序問題時,會很容易想到冒泡排,氣泡排序是通過兩輛比較數值,從而將數字移動到開始或者末尾的位置,反覆重複這個過程從而就達到了排序的目的。其時間複雜度大概是 n2 還有一種比較常用的插入排序,其思想與氣泡排序比較類...

資料結構 插入排序

一 直接插入排序 1 直接插入排序的演算法思想 r i 的鍵值ki與r 0 r i 1 的鍵值依次比較 從後往前比 找到r i 應插入的位置,並把從該位置開始的記錄後移乙個位置,把r i 插入到找到的插入位置,完成一趟直接排序 重複選r i 1 r n 完成上述操作,直到排序完畢 注 為什麼要從後往...

資料結構 插入排序

插入排序的基本思想是 每步將乙個待排序的物件,按其關鍵字大小,插入到前面已經排好序的一組物件的適當位置上,直到物件全部插入為止。簡言之,邊插入邊排序,保證子串行中隨時都是排好序的。新元素插入到 在已形成的有序表中線性查詢,並在適當位置插入,把原來位置上的元素向後順移。關鍵字序列t 13,6,3,31...