归并排序

来源:互联网 发布:大数据服务公司 编辑:程序博客网 时间:2024/05/29 15:42

本程序在VC环境下运行。

mergesort.h文件

#include<stdio.h>
#include<stdlib.h>


typedef int keyType;
typedef int otherType;


typedef struct{
keyType key;
otherType other_data;
}Record;


mergesort.cpp文件

#include "mergesort.h"


//归并两个有序的序列
void merge(Record r1[],int low,int mid,int high,Record r2[]){
int i,j,k;


i=low;
j=mid+1;


k=low;


while(i<=mid && j<=high){
if(r1[i].key<=r1[j].key){
r2[k]=r1[i];
i++;
}else{
r2[k]=r1[j];
j++;
}


k++;
}


while(i<=mid){
r2[k]=r1[i];
k++;
i++;
}


while(j<=high){
r2[k]=r1[j];
k++;
j++;
}
}


//递归进行归并
void msort(Record r1[],int low,int high,Record r3[]){
int mid;
Record r2[20];//作为辅佐空间


if(low==high){
r3[low]=r1[low];
}else{
mid=(low+high)/2;


msort(r1,low,mid,r2);
msort(r1,mid+1,high,r2);


merge(r2,low,mid,high,r3);
}
}


void Msort(Record r[],int n){//对数组r进行归并排序
msort(r,1,n,r);
}


void main(){
int i,j;


Record record[20];
int length;


printf("请输入待排序记录的长度:");
scanf("%d",&length);


for(i=1;i<=length;i++){
printf("请输入第%d个记录的值:",i);
scanf("%d",&j);


record[i].key=j;
}


for(i=1;i<=length;i++){
printf("%d\t",record[i].key);
}


printf("\n");


Msort(record,length);


for(i=1;i<=length;i++){
printf("%d\t",record[i].key);
}


printf("\n");
}


运行结果如下:

请输入待排序记录的长度:8
请输入第1个记录的值:19
请输入第2个记录的值:13
请输入第3个记录的值:5
请输入第4个记录的值:27
请输入第5个记录的值:1
请输入第6个记录的值:26
请输入第7个记录的值:31
请输入第8个记录的值:16
19      13      5       27      1       26      31      16
1       5       13      16      19      26      27      31
Press any key to continue


0 0