排序算法之插入排序算法

  1 /*
  2 *    Insert sort algorithm
  3 *    Powered by xcssp
  4 */
  5 
  6 #include <stdio.h>
  7 #include <stdlib.h>
  8 #define MAXSIZE 20
  9 
 10 typedef int KeyType;
 11 typedef struct{
 12     KeyType key;
 13 }RedType;
 14 typedef struct{
 15     RedType r[MAXSIZE+1];
 16     int length;
 17 }Sqlist;
 18 
 19 void initSqlist(Sqlist &L);
 20 void insertSort(Sqlist &L);
 21 void printSqlist(Sqlist &L);
 22 bool LT(KeyType r1, KeyType r2);
 23 void binaryInsertSort(Sqlist &L);
 24 
 25 int main(int argc, char argv){
 26     Sqlist L;
 27     initSqlist(L);
 28     insertSort(L);
 29     printSqlist(L);
 30     return 0;
 31 }
 32 
 33 void initSqlist(Sqlist &L){
 34     printf("input the sort record length:");
 35     if(!scanf("%d",&L.length) && L.length <= MAXSIZE ){
 36         printf("input error!\n");
 37         exit(-1);
 38     }
 39     int i;
 40     for(i=1; i<= L.length; ++i){
 41         //printf("input the record:");
 42         scanf("%d",&L.r[i].key);
 43     }
 44 } 
 45 
 46 bool LT(KeyType r1, KeyType r2){
 47     if(r1<r2){
 48         return true;
 49     }else{
 50         return false;
 51     }
 52 }
 53 
 54 // 直接插入排序 
 55 void insertSort(Sqlist &L){
 56     int i;
 57     for( i=2; i <= L.length; ++i){
 58         if(LT(L.r[i].key,L.r[i-1].key)){
 59             L.r[0].key = L.r[i].key;
 60             L.r[i].key = L.r[i-1].key;
 61             int j;
 62             for(j=i-2; LT(L.r[0].key,L.r[j].key); --j){
 63                 L.r[j+1].key = L.r[j].key;
 64             }
 65             L.r[j+1].key = L.r[0].key;
 66         }
 67     }
 68 }
 69 
 70 // 折半插入排序
 71 void binaryInsertSort(Sqlist &L){
 72     int i;
 73     for(i=2; i <= L.length; ++i){
 74         if(LT(L.r[i].key,L.r[i-1].key)){
 75             L.r[0].key = L.r[i].key;
 76             int left = 1;
 77             int right = i-1 ;
 78             while(left<=right){
 79                 int m;
 80                 m = (left + right)/2 ;
 81                 if(LT(L.r[0].key,L.r[m].key)) right = m-1;
 82                 else left=m+1;
 83             }
 84             int j;
 85             for(j=i-1; j>= right+1; --j){
 86                 L.r[j+1].key = L.r[j].key;
 87             }
 88             L.r[right+1].key = L.r[0].key;
 89         }
 90     }
 91 }
 92 
 93 void printSqlist(Sqlist &L){
 94     printf("Sqlist as follow:");
 95     int i;
 96     for(i=1; i <= L.length; ++i){
 97         printf(" %d ",L.r[i].key);
 98     }
 99     printf("\n");
100 }
posted @ 2012-10-08 13:56  指尖的舞客  阅读(145)  评论(0)    收藏  举报