#include <stdio.h>
int halfSearch(int a[],int p,int r,int key)
{
int q=(p+r)/2;
while(a[q]!=key && a[p]<key && a[r]>key)
{
q=(p+r)/2;
if(a[q]>key)
{
r=q-1;
}
else
{
p=q+1;
}
}
if(a[q]==key)
{
return q;
}
if(a[r]<key)
{
return r;
}
if(a[p]>key)
{
return p-1;
}
}
void insertSort(int a[],int len)
{
int i,j,k,key;
for(i=1;i<len;i++)
{
key=a[i];
j=halfSearch(a,0,i-1,key);
for(k=i;k>j;k--)
{
a[k]=a[k-1];
}
a[k+1]=key;
}
}
int main()
{
int a[]={31,41,59,26,41,58};
insertSort(a,6);
for(int i=0;i<6;i++)
{
printf("%d ",a[i]);
}
getchar();
}
查找操作可以改进到lgn,但如果使用数组,移动元素操作最坏情况上界仍然为n平方,所以无法改进为nlgn。使用链表可以。