思路:从数组第二个元素开始折半插入,即把第一个元素看成有序的,然后下标后移一位,直到数组最后一个元素折半插入成功,注意:数组第0号元素不存值,用来存储每次要插入的数据
步骤:1.判断要插入的元素是否处于有序状态,是则继续,否则下标后移
2.利用折半查找要插入的下标,记为t
3.从t开始所有数据后移一位,插入已经标记在a[0]的元素
//length为数组长度(0号下标不存值,不计算在长度中) void insert(int *a,int length) { for(int i=2;i<=length;i++)//从第二个元素到最后一个元素依次插入 { if(a[i]<a[i-1])//判断要插入的元素是否小于前一个元素,是则无序,否则有序,无需插入 { //折半查找要插入位置的下标 int low=1,high=i-1; a[0]=a[i];//a[0]用来标记元素 //折半查找要插入的下标位置 while (low<=high) { int mid=(low+high)/2; if(a[mid]<a[0]) low=mid+1; else high=mid-1; } //循环结束,low为要插入的下标,使low之后的元素统一向后移一位 for(int j=i-1;j>=low;j--) a[j+1]=a[j]; a[low]=a[0];//插入已经标记的元素 } } }