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