码迷,mamicode.com
首页 > 编程语言 > 详细

直接插入排序

时间:2015-03-17 17:30:55      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!