//折半插入排序
#include<stdio.h>
//内存分配函数需加载的头文件
#include<stdlib.h>
//定义顺序表结构类型
typedef struct
{
//数据域
int *data;
//长度
int length;
}List;
//顺序表初始化
void initL(List &L,int n)
{
//为顺序表分配存储空间 0号位置作哨兵岗位 故多分配1个存储空间
L.data=(int *)malloc(sizeof(int )*(n+1));
L.length=n;
}
//折半插入排序
void order(List &L)
{
//i j for循环遍历索引
int i,j;
//从第2个元素开始,进行n-1次排序
for(i=2;i<=L.length;i++)
{
//判断当前元素是否需要进行排序
if(L.data[i]<L.data[i-1])
{
//将待排序元素存入哨兵岗位
L.data[0]=L.data[i];
//利用折半查找法 找到L,data[i]待排序元素的合适位置
int low,high,mid;
low=1;
high=i-1;
while(low<=high)
{
mid=(low+high)/2;
if(L.data[mid]>L.data[0])
{
high=mid-1;
}
else if(L.data[mid]<L.data[0])
{
low=mid+1;
}
}
//此时low>high low值就是待排序元素的合适位置,移动
for(j=i-1;j>=low;j--)
{
L.data[j+1]=L.data[j];
}
L.data[low]=L.data[0];
}
}
}