1.排序原理 折半插入排序法是对直接插入排序法的改进,直接插入排序法(),是在前面已排好序的序列中顺序查找要插入的位置,折半插入排序法则是用二查找法找到要插入的位置,然后插入。 2.代码 登录后复制 #include <stdio.h> void printArray(int a[],int size){ printf("数组为:[%d] ",a[0]); for (int i=1;i<size;i++) { printf(" %d ",a[i]); } printf("\n"); } void main() { //a[0]为监视哨 int a[8]={0,38,65,97,76,13,27,49}; for (int i=2;i<=7;i++) { printf(" i=%d ",i); printArray(a,8); //将要插入的数放监视哨 a[0]=a[i]; int low=1,high=i-1; //while循环用二分查找法找到要插入的位置为 high+1 while(low<=high){ int m=(low+high)/2; if (a[0]<a[m]) { high=m-1; }else{ low=m+1; } } printf("\n%d要插入%d位置",a[0],a[high+1]); if (i-1>=high+1) { printf("\n%d到%d,要向前移一位\n",a[high+1],a[i-1]); } //将 high+1到i-1位置数据移到 high+2到i位置 for (int j=i-1;j>=high+1;--j) { a[j+1]=a[j]; } // high+1插入要插入的数据 a[high+1]=a[0]; } printf("结果 "); printArray(a,8); } 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53. 3结果 登录后复制 i=2 数组为:[0] 38 65 97 76 13 27 49 65要插入65位置 i=3 数组为:[65] 38 65 97 76 13 27 49 97要插入97位置 i=4 数组为:[97] 38 65 97 76 13 27 49 76要插入97位置 97到97,要向前移一位 i=5 数组为:[76] 38 65 76 97 13 27 49 13要插入38位置 38到97,要向前移一位 i=6 数组为:[13] 13 38 65 76 97 27 49 27要插入38位置 38到97,要向前移一位 i=7 数组为:[27] 13 27 38 65 76 97 49 49要插入65位置 65到97,要向前移一位 结果 数组为:[49] 13 27 38 49 65 76 97 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21. 原创作者: u_4937244 转载于: https://blog.51cto.com/u_4937244/11575820