折半插入排序
折半插入排序:没有哨兵的概念。a[0]只要是保存待插入元素
改善:减少了元素之间的比较次数,但是元素之间的移动次数没有改变。
#include<iostream> using namespace std; void BInsertSort(int a[],int length){ int i,j; int low,high; for(i=2;i<=length;i++){ a[0]=a[i]; if(a[i-1]>a[0]){ //保存待插入元素 low=1; high=i-1; while(low<=high){ int mid=(low+high)/2; if(a[mid]>a[0]) //在低半区 high=mid-1; else low=mid+1; //高半区,即便是等于也是高半区,待插入元素在其后 } for(j=i-1;j>=high+1;j--){ a[j+1]=a[j]; } a[high+1]=a[0];//high+1总是待插入元素的应该插入的位置,high是最后一个不该移动的位置 } } } int main(void) { int a[7]={0,4,5,5,9,10,8}; BInsertSort(a,6); }