1、数组排序代码
#include<stdio.h>
//折半插入排序:先利用折半查找算法,在数组前找到插入位置,再移动元素,最后插入该元素
void BinarySort(int array[],int len){
int i,j;
int low,high,mid;
int temp;
for(i=1;i<len;i++){ //从第二个元素开始,逐个向前插入元素
low=0; //low从0位置开始
high=i-1; //high从当前选择的元素的前一个位置开始
temp=array[i]; //标记当前选择的元素
while(low<=high){ //折半查找,先找到插入位置,跳出循环时,high<low,即high在low前
int mid=(low+high)/2; //取中间点
if(array[mid]>temp){ //在前半部分查找
high=mid-1;
}else{ //在后半部分查找
low=mid+1;
}
}
for(j=i-1;j>=high+1;j--){ //插入位置为high+1,要将high后一个位置元素(即low位置),当前选择元素之前的元素后移
array[j+1]=array[j];
}
array[j+1]=temp; //执行完for循环后,j自减了1,故插入位置应为j+1
}
}
//测试
int main(){
int data[]={29,34,53,12,32,67,86,36,0};
int len=(int)sizeof(data)/sizeof(*data);
int i;
printf("排序前的数据信息为:\n");
for(i=0;i<len;i++){
printf("%-4d",data[i]);
}
printf("\n排序后的数据信息为:\n");
BinarySort(data,len);
for(i=0;i<len;i++){
printf("%-4d",data[i]);
}
}
实验结果
2、应用:学生成绩排序
#include<stdio.h>
#define Size 4//姓名数组长度
#define Len 6//数组结构体个数(即学生个数-1)
typedef struct{
int key;
char info[Size];
}DataStruct;//数组结构体
//折半插入排序
void BinarySort(DataStruct ds[],int len){
int i,j;
int low,high,mid;
for(i=2;i<len;i++){//从第二个元素开始,逐个向前插入元素(ds[0]未存放数据)
low=1;//low开始位置
high=i-1;//high开始位置
ds[0]=ds[i];//第一个结构体ds[0]存放当前选择要插入的结构体信息
while(low<=high){//折半查找,跳出循环时high<low,high+1为插入位置(即为low位置)
mid=(low+high)/2;
if(ds[mid].key>ds[0].key){
high=mid-1;
}else{
low=mid+1;
}
}
for(j=i-1;j>=high+1;j--){//high+1位置至当前选择插入元素之前的元素后移
ds[j+1]=ds[j];
}
ds[j+1]=ds[0];//插入当前选择的元素
}
}
//测试
int main(){
DataStruct ds[Len];
int i;
for(i=1;i<Len;i++){//第一个ds[0]不存放学生信息
printf("请输入第%d个同学的姓名:\n",i);
gets(ds[i].info);
printf("请输入第%d同学的成绩:\n",i);
scanf("%d",&ds[i].key);
getchar();//吸收回车字符
}
BinarySort(ds,Len);
for(i=1;i<Len;i++){
printf("\n第%d名 姓名:%s 成绩:%d\n",Len-1-i,ds[i].info,ds[i].key);
}
}
实验结果