折半插入排序算法是直接插入排序算法的改进;插入元素的位置通过折半查找确定。
折半插入排序算法的时间复杂程度为O(n^2);空间负责程度是O(1)
具体算法如下:
数据结构如下:
typedef struct ElemType
{
int key;//标示大小的依据
}recordtype;
//数组array[0]的位置无效,充当辅助存储空间
void binaryInsertSort(recordtype array[],int n)
{
for(int i= 2;i<=n;i++)//进行n-1趟排序,n是要排序的记录的个数
{
array[0] = array[i];//哨兵:防止数组越界,保存待排序的元素
//折半查找插入的位置
int low = 1;
int high = i-1;
while(low<=high)
{
int mid = (low+high)/2;
if(array[0].key>=array[mid].key)//千万注意此处的等于号不可以去掉,否则算法将会变成不稳定的排序算法
low = mid+1;
else
high = mid-1;
}
//元素后移
for(int j=i-1;j>=high+1;j--) //high+1 为插入的位置
{
array[j+1]=array[j];
}
array[high+1]=array[0];
}
}