标签:
1.直接插入排序(Straight Insertion Sort)是一种最简单的排序方法,它的基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增1的有序表。
1 //-----------------对顺序表L作直接插入排序算法-------------------- 2 void InsertSort(SqList &L){ 3 for(i=2;i<=L.length;++i) 4 if(LT(L.r[i].key,L.r[i-1].key)){ //"(",需将L.r[i]插入有序子表 5 L.r[0] = L.r[i]; //复制为哨兵 6 L.r[i] = L.r[i-1]; 7 for(j=i-2;LT(L.r[0].key,L.r[j].key);--j) 8 L.r[j+1] = L.r[j]; //记录后移 9 L.r[j+1] = L.r[0]; //插入到正确位置 10 } 11 }//InsertSort
直接插入排序的时间复杂度为O(n2).
2.折半插入排序
由于插入排序的基本操作是在一个有序表中进行查找和插入。这个“查找”操作可以利用“折半查找”来实现,由此进行的插入排序称之为折半插入排序(Binary Insertion Sort)。
1 //---------------对顺序表L作折半插入排序--------------- 2 void BInsertSort(SqList &L){ 3 for(i=2;i<=L.length;++i){ 4 L.r[0] = L.r[i]; //将L.r[i]暂存到L.r[0] 5 low = 1; high = i-1; 6 while(low <= high){ //在r[low..high]中折半查找有序插入的位置 7 mid = (low + high)/2; //折半 8 if(LT(L.r[0].key,L.r[m].key)) 9 high = mid -1; //插入点在低半区 10 else 11 low = mid + 1; //插入点在高半区 12 }//while 13 for(j=i-1;j>=high+1;--j) 14 L.r[j+1] = L.r[j]; //记录后移 15 L.r[high+1]=L.r[0]; //插入 16 }//for 17 }//BInsertSort
折半插入排序所需附加存储空间和直接插入排序相同,从时间上比较,折半插入仅减少了关键字间的比较次数,而记录的移动次数不变。因此,折半插入排序的时间复杂度仍为O(n2).
标签:
原文地址:http://www.cnblogs.com/wxb713/p/4344819.html