折半插入排序

折半插入排序:没有哨兵的概念。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);
}

                            
                               
                   


posted @ 2015-05-20 16:00  kkshaq  阅读(199)  评论(0编辑  收藏  举报