插入類排序

2021-08-27 11:41:43 字數 1734 閱讀 2078

插入類排序基本思想:在乙個已經排好序的記錄子集的基礎上,每一步將下乙個待排序的記錄有序插入已排好序的子集中,直到將所有待排序記錄插入為止。

1.直接插入排序:

演算法思想:將第i個記錄插入到前面i-1個已經排好序的記錄中。

假設待排序記錄存放在r[1..length]之中,為了提高效率附設乙個監視哨r[0],使得r[0]始終存放待插入的記錄。監視哨的作用有兩個:乙個是備份待插入的記錄,以便前面關鍵字較大的記錄後移;二是防止越界;

void  insert(recordtype r[ ],int length)  //對記錄陣列r做直接插入排序,length為陣列中待排序記錄的數目

for(int i=2;ir[0]=r[i];    j=i-1; //將待插入記錄存放到監視哨r[0]中

while(r[0].key < r[j].key)  //尋找插入位置

r[j+1]=r[j];

j--;

r[j+1]=r[0];

}   //將待插入記錄插入到已排好序的序列中

演算法分析:最好情況 總比較次數n-1次  移動記錄次數最小2(n-1)

最壞情況  總比較次數(n+2)(n-1)/2  移動次數 (n+4)(n-1)/2

演算法執行時間耗費主要取決於資料分布情況 約n2/4  事件複雜度t(n)=o(n2)  空間複雜度s(n)=o(1)

穩定的排序方法,適合於待排序記錄數目較少且基本有序的情況

2.折半插入排序

演算法思想:運用折半查詢思想插入

void binsort(recordtype r[ ],int length)  //對記錄陣列r進行折半插入排序,length為陣列的長度

for(i=2;i<=length;i++)

x=r[i];

low=1,hing=i-1;

while(low <= high)  //確定插入位置

mid=(low+high)/2;

if(x.keyelse low=mid+1;

for(j=i-1;j>=low;--j)   r[j+1]=r[j];  //記錄依次向後移

r[row]=x;  //插入記錄

演算法分析:採用折半插入排序法,可減少關鍵字比較次數。比較次數:nlog2n

並未改變移動元素的時間耗費,時間複雜度為o(n2)

3. 演算法改進要點:將待排序關鍵字分成若干較小的子串行,對子序列進行直接插入排序,使整個待排序序列排好序

時間複雜度可以提高到o(n)

void shellinsert(recordtype r[ ],int length,int delt)

for(i=1+delt;i<=length;i++)  //1+delt為第乙個字序列的第二個元素的下標

if(r[i].key < r[i-delt].key) 

r[0]=r[i];                //備份r[i]( 不做監視哨)    

for(j=i-delt;j>0&&r[0].keyr[j+delt]=r[0];

r[j+delt]=r[0];

void shellsort(recordtype r[ ],int length,int delta[ ],int n)

//對記錄陣列r做希爾排序,length為陣列r的長度,delt為增量陣列,n為delt[ ]的長度

for(i=0;i<=n-1;++i)

shellinsert(r,length,delta[i]);

時間複雜度o(n1.5)   不穩定排序

插入類排序

一 直接插入排序 straight insertion sort 1.時間複雜度 o n2 2.空間複雜度 o 1 3.實現 1 void insertsort int a,int num 10 a j 1 a 0 插入到正確位置11 12 13 二 折半插入排序 binary insertion ...

排序之插入類排序

1.直接插入排序 思想 從無到有,陣列一直保持有序遞增,新來的元素p與數值r從末到首比較,若p小於陣列數值,則將陣列值後移,為p的插入預留空間 r從r 1 開始儲存,最壞情況下時間r中元素遞增,時間複雜度為o n 2 空間複雜度為o 1 void insertsort int r,int n els...

內部排序(1) 插入類排序

插入類排序 一 直接插入排序 演算法分析 從空間角度來看,只需要乙個輔助空間r 0 從時間角度來看,主要時間耗費在關鍵字比較和移動元素上。直接插入排序的時間複雜度為o n 2 空間複雜度為o 1 直接插入排序是穩定的。直接插入排序在基本有序時效率較高,並且在序列規模不是很大時效率也很高。void i...