一、要点
- 每次折半插入的范围都是下标从0到要插入元素的前一个元素
- 插入前都要将要插入位置之后的元素向后移动一位一直到要进行插入的元素
二、代码
//折半插入排序; #include<stdio.h> #define N 10 //对数组a进行折半插入排序,n为数组的长度; void Half_Sort(int a[]) { for(int i=1;i<N;i++) { int x=a[i]; //将需要进行插入排序的元素赋值给x; int low=0,high=i-1; //设置折半的头和尾; while(low<=high) { int mid=(low+high)/2; //设置中间元素,与插入的元素进行比较; if(x<a[mid]) //比较; high=mid-1; else low=mid+1; } for(int j=i-1;j>=low;j--) //记录依次向后移; a[j+1]=a[j]; //将当前这个值赋给这个元素的后一个元素; a[low]=x; //插入记录; } } int main(void) { int a[N]={3,2,8,5,4,7,6,9,1,10}; //定义数组; printf("原始数据为:\n"); for(int i=0;i<N;i++) //输出原始数据; printf("%d ",a[i]); printf("\n\n"); Half_Sort(a); printf("使用插入排序后的数据为:\n"); for(int i=0;i<N;i++) printf("%d ",a[i]); printf("\n"); return 0; }