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 }