代码如下
#include <stdio.h>
#include <stdlib.h>
//折半插入排序
int InsertSort(int S[], int n){
int i, j, low, high, mid;
for(i = 1; i < n; i++){
S[0] = S[i]; //将S[i]暂存到“哨兵”S[O]
low = 1; //设置折半查找的范围
high = i-1; //设置折半查找的范围
while(low <= high){
mid = (low+high) / 2; //取中间点
if(S[mid] > S[0]) //折半查找
high = mid - 1; //查找mid左半边
else
low = mid + 1; //查找mid右半边
}
for(j = i-1; j >= high+1; j--) //统一后移元素,将插入位置空出
S[j+1] = S[j];
S[high+1] = S[0]; //空位插入元素
}
return 1;
}
int main(){
int n;
printf("请输要排序数的个数:");
scanf("%d", &n);
int S[n+1];
printf("请输入要排序的数,使用空格隔开:");
for (int i = 1; i < n+1; i++){ //从1开始是因为S[0]用于存放“哨兵”
scanf ("%d", &S[i]);
}
if (InsertSort(S, n+1)){
printf("排序成功:");
for (int i = 1; i < n+1; i++)
{
printf("%d ",S[i]);
}
printf("\n");
}
system("pause");
}
执行结果
如有错误,请指正。