#include <iostream>
#define Maxitem 100
typedef int KeyType;
typedef char ElemType[5];
typedef struct rec{
KeyType key; //key
ElemType data; //数据域
} elemNode[Maxitem] ;
struct rec sqlist[Maxitem];
void disp(elemNode r, int n){
int i;
printf("从低到高排列:\n");
for(i=1;i<=n;i++){
printf("%6d",r[i].key);
}
printf("\n");
for(i=1;i<=n;i++){
printf("%6s",r[i].data);
}
printf("\n");
}
/**r[L....m] r1[m+1 ...h] 归并后放入r1 i和j是r的指示器,i的取值L到m , j的取值是m+1 到h , k是r1 的指示器*/
void merge(elemNode r,elemNode r1,int L,int m,int h){
int i=L ,j=m+1, k=L;
while (i<=m && j<=h){
if(r[i].key <= r[j].key){ //r的前一位小于后一位
r1[k]=r[i]; //将前一位小的放入r1
i++; //向后移动
}else{ //r的前一位大于后一位
r1[k]=r[j]; //将后一位小的放入r1
j++; //向后移动
}
k++;
}
if(i>m){ //后部分开始
while(j<=h){
r1[k]=r[j]; //把后部分复制给r1
j++;
k++;
}
}else{ //后部分结束
while(i<=m){
r1[k]=r[i]; //把前部分复制给r1
i++;
k++;
}
}
}
void mergepass(elemNode r,elemNode r1, int n,int L){
int p=1;
while(n-p+1 > 2*L){
merge(r,r1,p,p+L-1,p+2*L-1);
p+=2*L; //p向后移动2*L,进入下一次合并
}
if(n-p+1 >L){ //长度大于L的部分合并
merge(r,r1,p,p+L-1,n);
}else{ //剩下长度小于L的部分复制r1
for(;p<=n;p++){
r1[p]=r[p];
}
}
}
void mergeSort(elemNode r,elemNode r1,int n){
int L =1;
while(L<n){
mergepass(r,r1,n,L);//将r归并到r1
L *= 2;
mergepass(r1,r,n,L);//将r1归并到r
L *= 2;
}
}
void main(){
elemNode s={0,"",75,"王华",87,"李英",68,"张萍",92,"陈涛",88,"刘丽",62,"张强",77,"孙军",96,"朱斌",80,"许伟",72,"曾压"};
elemNode s1;
int n=10;
mergeSort(s,s1,n);
disp(s,n);
}
测试结果
从低到高排列:
62 68 72 75 77 80 87 88 92 96
张强 张萍 曾压 王华 孙军 许伟 李英 刘丽 陈涛 朱斌