#include<stdio.h> #include<stdlib.h> #define maxsize 8 typedef struct{ int r[maxsize+1]; int len; }sqlist; //直接插入排序 void InsertSort(sqlist &st ) { int i,j,t; for(i=2;i<st.len;i++) { st.r[0] = st.r[i]; for(j=i-1;j>0 && st.r[0]<st.r[j] ;j--) //直接算,每一个来,都比较 st.r[j+1] = st.r[j]; st.r[j+1] = st.r[0]; } } void InsertSort1(sqlist &st ) { int i,j,t; for(i=2;i<st.len;i++) if( st.r[i] < st.r[i-1] ) { st.r[0] = st.r[i]; for(j=i-1;j>0 && st.r[0]<st.r[j] ;j--) //其实if已经比较过,因此这样写没有 2 的效率高 st.r[j+1] = st.r[j]; st.r[j+1] = st.r[0]; } } void InsertSort2(sqlist &st ) { int i,j,t; for(i=2;i<st.len;i++) if( st.r[i] < st.r[i-1] ) { st.r[0] = st.r[i]; st.r[i] = st.r[i-1]; for(j=i-2;j>0 && st.r[0]<st.r[j] ;j--) //此处是j=i-2,在上一行中已经比较过,故减少一次交换 st.r[j+1] = st.r[j]; st.r[j+1] = st.r[0]; } } int main() { sqlist st; int d[maxsize] = {49,38,65,97,76,13,27,49}; for(int i=0;i<8;i++) st.r[i+1] = d[i];//将数组的第一项置为空 st.len = maxsize+1; InsertSort2(st); for(int j=1;j<st.len;j++) printf("%d\n",st.r[j]); return 0; }
不将数组的第一项置空,也可以写:
#include<stdio.h> #include<stdlib.h> #define len 12 void InsertSort(int d[]) { int i,j,t; for(i=1;i<len;i++) if( d[i] < d[i-1] ) { t = d[i]; d[i] = d[i-1]; for(j = i-2; j>=0 && t < d[j];--j) d[j+1] = d[j]; d[j+1] = t; } } void InsertSort1(int d[])//没有上一种写法效率高,因此即使后项比前项大,还要进行循环内的比较, //而按照直接插入的思想,后项如果比前项大,那么可以直接放入数组中, //不再进入循环比较 { int i,j,t; for(i=1;i<len;i++) { t = d[i]; for(j = i-1; j>=0 && t< d[j];--j) d[j+1] = d[j]; d[j+1] = t; } } int main() { int d[len] = {49,38,65,97,76,13,27,49,85,11,23,47}; InsertSort1(d); for(int k=0;k<len;k++) printf("%d\n",d[k]); return 0; }