1.2插入排序-折半插入排序
/* Binary Insertion Sort*/
一.评估
稳定的排序算法
时间复杂度O(n^2)
移动次数 最小值n-1,最大值(n+2)(n-1)/2,平均值(n^2)/4。
与直接插入相比较少了比较的次数。
二.思想
逐一插入,折半比较。
r[0]作用:哨兵(监视哨)、暂存器。
void BiInsertSort(int *r)
{
int i,j,high,low,m;
for(i = 2; i <= N; i ++)
{
r[0] = r[i];<span style="white-space:pre"> </span>//r[0]为哨兵、暂存器
low = 1;
high = i-1;
while(low <= high)//查找插入点
{
m = (low + high)/2;
if(r[0] < r[m])
high = m-1;
else
low = m+1;
}
for(j = i-1;j >= high+1;j --)
{
r[j+1] = r[j];
}
r[high+1] = r[0];
}
}
三.示例
/* Binary Insertion Sort*/
<span class="comment" style="background-color: inherit; line-height: 18px; font-family: Consolas, 'Courier New', Courier, mono, serif; margin: 0px; padding: 0px; border: none; color: rgb(0, 130, 0);">//Copyright @wangwei14309 All rights reservd</span><span style="background-color: inherit; color: black; line-height: 18px; font-family: Consolas, 'Courier New', Courier, mono, serif; margin: 0px; padding: 0px; border: none;"> </span>
# include <stdio.h>
void creat(int *r);
void BiInsertSort(int *r);
void print(int *r);
int N;
int main()
{
int a[50];
creat(a);
BiInsertSort(a);
print(a);
}
void creat(int *r)
{
int i;
printf("sort how many numbers :");
scanf("%d",&N);
printf("input %d numbers :",N);
for(i = 1;i <= N;i ++)
{
scanf("%d",&r[i]);
}
}
void BiInsertSort(int *r)
{
int i,j,high,low,m;
for(i = 2; i <= N; i ++)
{
r[0] = r[i];//r[0]为哨兵、暂存器
low = 1;
high = i-1;
while(low <= high)//查找插入点
{
m = (low + high)/2;
if(r[0] < r[m])
high = m-1;
else
low = m+1;
}
for(j = i-1;j >= high+1;j --)
{
r[j+1] = r[j];
}
r[high+1] = r[0];
}
}
void print(int *r)
{
int i;
printf("the result is :");
for(i = 1;i <= N;i ++)
printf("%d ",r[i]);
printf("\n");
}