直接插入法

直接插入排序基本思想 

一、基本思想 
         假設待排序的記錄存放在數組R[1..n]中。初始時,R[1]自成1個有序區,無序區爲R[2..n]。從i=2起直至i=n爲止,依次將R[i]插入當前的有序區R[1..i-1]中,生成含n個記錄的有序區。 

二、第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; 

數組

相關文章
相關標籤/搜索