直接插入法

直接插入排序基本思想 

1、基本思想 
         假设待排序的记录存放在数组R[1..n]中。初始时,R[1]自成1个有序区,无序区为R[2..n]。从i=2起直至i=n为止,依次将R[i]插入当前的有序区R[1..i-1]中,生成含n个记录的有序区。 

2、第i-1趟直接插入排序: 
         通常将一个记录R[i](i=2,3,…,n-1)插入到当前的有序区,使得插入后仍保证该区间里的记录是按关键字有序的操作称第i-1趟直接插入排序。 
         排序过程的某一中间时刻,R被划分成两个子区间R[1..i-1](已排好序的有序区)和R[i..n](当前未排序的部分,可称无序区)。 
         直接插入排序的基本操作是将当前无序区的第1个记录R[i]插人到有序区R[1..i-1]中适当的位置上,使R[1..i]变为新的有序区。因为这种方法每次使有序区增加1个记录,通常称增量法。 
         插入排序与打扑克时整理手上的牌非常类似。摸来的第1张牌无须整理,此后每次从桌上的牌(无序区)中摸最上面的1张并插入左手的牌(有序区)中正确的位置上。为了找到这个正确的位置,须自左向右(或自右向左)将摸来的牌与左手中已有的牌逐一比较。 

一趟直接插入排序方法 

1.简单方法 
         首先在当前有序区R[1..i-1]中查找R[i]的正确插入位置k(1≤k≤i-1);然后将R[k..i-1]中的记录均后移一个位置,腾出k位置上的空间插入R[i]。 
    注意: 
         若R[i]的关键字大于等于R[1..i-1]中所有记录的关键字,则R[i]就是插入原位置。 

2.改进的方法 
  一种查找比较操作和记录移动操作交替地进行的方法。 
具体做法: 
         将待插入记录R[i]的关键字从右向左依次与有序区中记录R[j](j=i-1,i-2,…,1)的关键字进行比较: 
         ①   若R[j]的关键字大于R[i]的关键字,则将R[j]后移一个位置; 
            ②若R[j]的关键字小于或等于R[i]的关键字,则查找过程结束,j+1即为R[i]的插入位置。 
         关键字比R[i]的关键字大的记录均已后移,所以j+1的位置已经腾空,只要将R[i]直接插入此位置即可完成一趟直接插入排序。 

直接插入排序算法 

1.算法描述 
    void   lnsertSort(SeqList   R) 
      {   //对顺序表R中的记录R[1..n]按递增序进行插入排序 
        int   i,j; 
        for(i=2;i <=n;i++)   //依次插入R[2],…,R[n] 
            if(R[i].key <R[i-1].key){//若R[i].key大于等于有序区中所有的keys,则R[i] 
                                                            //应在原有位置上 
                R[0]=R[i];j=i-1;   //R[0]是哨兵,且是R[i]的副本 
                do{   //从右向左在有序区R[1..i-1]中查找R[i]的插入位置 
                  R[j+1]=R[j];   //将关键字大于R[i].key的记录后移 
                  j--   ; 
                  }while(R[0].key <R[j].key);   //当R[i].key≥R[j].key时终止 
                R[j+1]=R[0];   //R[i]插入到正确的位置上 
              }//endif 

      }//InsertSort   

/*   直接插入排序的算法源程序*/ 

#include <stdio.h> 

#define   MAXNUM   100 

typedef   int   KeyType; 
typedef   int   DataType; 
typedef   struct   { 
        KeyType   key;               /*   排序码字段   */ 
        /*DataType   info;                       记录的其它字段   */ 
}   RecordNode; 

typedef   struct   { 
        int   n;                               /*   n为文件中的记录个数,n <MAXNUM   */ 
        RecordNode   record[MAXNUM]; 
}   SortObject; 

void   insertSort(SortObject   *   pvector)   {   /*   按递增序进行直接插入排序   */ 
        int   i,   j; 
        RecordNode   temp; 
        RecordNode   *data   =   pvector-> record; 

        for(   i   =   1;   i   <   pvector-> n;   i++   )   {   /*   依次插入记录R1,   R2…Rn-1   */ 
                temp   =   data[i];   
                for   (   j   =   i-1;   temp.key   <   data[j].key   &&   j   > =   0;   j--   ) 
                        /*   由后向前找插入位置   将排序码大于ki的记录后移   */ 
                        data[j+1]   =   data[j]; 
                if(   j   !=   i-1   )   data[j+1]   =   temp; 
        } 


SortObject   vector   =   {10,   
        49,   38,   65,   97,   76,   13,   27,   49,   50,   101}; 

int   main(){ 
        int   i; 
        insertSort(&vector); 
        for(i   =   0;   i   <   vector.n;   i++) 
                printf( "%d   ",   vector.record[i]); 
        getchar(); 
        return   0; 

转载于:https://my.oschina.net/u/553254/blog/73106

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值