(2)折半插入排序
***思想
将折半查找思想用于在有序记录中确定应插入位置,相应的排序法称为折半插入排序法。
***算法
void BinSort(RecordType r[],int length)
{
int i,j,low,high,mid;
RecordType x;
for(i = 2;i<=length;i++)
{
low = 1,high = i-1;
x = r[i];
whild(low <= high) //查找插入位置
{
mid = (low+high)/2;
if(x.key < r[mid].key)
{
high = mid-1;
}
else
{
low = mid+1;
}
}
for(j = i-1;j>=low;j--) //后移
{
r[j+1] = r[j];
}
r[low] = x; //插入
}
}
***案例
#include<stdio.h>
#include<stdlib.h>
typedef int KeyType;
typedef int OtherType;
typedef struct _RecordType
{
KeyType key;
OtherType other_data;
}RecordType;
void BinSort(RecordType r[],int length)
{
int i,j,low,high,mid;
RecordType x;
for(i = 2;i<=length;++i)
{
x =r[i];
low = 1;
high = i-1;
while(low <= high) //查找插入位置
{
mid = (low+high)/2;
if(x.key < r[mid].key)
{
high = mid-1;
}
else
{
low = mid+1;
}
}
for(j = i-1;j>=low;--j) //后移
{
r[j+1] = r[j];
}
r[low] = x; //插入
}
}
int main()
{
int i,len;
RecordType r[20];
printf("请输入数组的长度:\n");
scanf("%d",&len);
for(i = 1;i<=len;i++)
{
printf("请输入数组中第%d个元素 ",i);
scanf("%d",&r[i].key);
}
printf("\n");
printf("排序前的结果:\n");
for(i = 1;i<=len;i++)
{
printf("%d ",r[i].key);
}
printf("\n");
BinSort(r,len);
printf("排序后的结果:\n");
for(i = 1;i<=len;i++)
{
printf("%d ",r[i].key);
}
printf("\n");
return 0;
}