折半插入排序
基本思路:由于插入排序的基本操作是在一个有序表中进行查找与插入,其中的查找操作可以利用折半查找来实现
# include <stdio.h>
//此次排序为升序
//折半查找 返回目标数据要插入的下标
int HalfSear(int *a, int n, int num){
int frist = 0;
int final = n-1;
int mid;
while(frist <= final){
mid = (frist+final)/2;
if(a[mid]<num)
frist = mid+1;
else
final = mid-1;
}
return frist;
}
void HalfInsertSort(int *a, int n){
int i, j;
int t, temp;
for(i = 1; i < n; i++)
temp = a[i];
t = HalfSear(a, i, a[i]);//找到a[i]要插入的位置
for(j = i; j>t; j--)
a[j] = a[j-1];
a[t] = temp;//将a[i]插入正确位置
printf("第%d次排序:", i);
for(t = 0; t < n; t++){
printf("%d ", a[t]);
}
printf("\n");
}
}
int main(void){
int a[] = {5,4,1,2, 3};
int n = 5;
HalfInsertSort(a, n);
return 0;
}