您的位置:首页 > 其它

排序算法------归并排序

2013-01-06 10:02 323 查看
#include<stdio.h>
#include<stdlib.h>

#define Status int
#define  max 20
typedef struct {
Status key;
}ElemType;
typedef struct {
ElemType  r[max];
int length;
}Sqlist;
void  Inital(Sqlist &L) //初始化
{
L.r[1].key=49;
L.r[2].key=38;
L.r[3].key=65;
L.r[4].key=97;
L.r[5].key=76;
L.r[6].key=13;
L.r[7].key=27;
L.r[8].key=49;
L.length=8;
}
bool LT(int i,int j)
{
if(i<j)
return true;
else return false;
}
void Merge(ElemType sr[],ElemType tr[],int i,int m,int n)//将sr从m分开的两部分合并到tr中去
{
int j,k;
for(j=m+1,k=i;i<=m&&j<=n;++k)  //j用来记录sr数组中后半部分,k用来记录前半部分
{
if(sr[i].key<sr[j].key)  tr[k]=sr[i++];//如果后半部分打头的比前半部分打头的大,将小的那个给tr
else   tr[k]=sr[j++]; //反之把大的给tr
}
while(i<=m||j<=n)  //当一个部分已经没了而另一部分还有时
{
if(j<=n)   tr[k++]=sr[j++];
if(i<=m)   tr[k++]=sr[i++];
}
}
void MSort(ElemType sr[],ElemType tr1[],int s,int t)//sr数组用来提供原始序列,tr1用来存储排好的序列的
{
ElemType tr2[20];  int m;
if(s==t)    tr1[s]=sr[s];   //如果在平分的时候还剩一个直接给tr1,不合并了
else{
m=(s+t)/2;//将sr[s...t]平均分成sr[s...m]和sr[m+1...t]
MSort(sr,tr2,s,m);//用递归的方法将sr[s...m]归并到有序的tr2[s....m]
MSort(sr,tr2,m+1,t);//用递归的方法将sr[m+1...t]归并到有序的tr2[m+1....t]
Merge(tr2,tr1,s,m,t);//将两部分归并到tr1中
}
}
void MergeSort(Sqlist &l)   //归并排序算法
{
MSort(l.r,l.r,1,l.length); //一个l.r是提供初始序列的,另一个l.r是用来存储排好的序列的
}
void print(Sqlist l)
{
int i;
printf("排序后的结果为:");
for(i=1;i<=l.length;i++)
{
printf("%d  ",l.r[i].key);
}
}
void main()
{
Sqlist l;
Inital(l);
MergeSort(l);
print(l);
getchar();
getchar();
}
//算法分析:1.归并排序所需的时间复杂度为O(nlogn)
//2.归并排序所需的辅助存储空间为O(n)
//3.是一种稳定的排序方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: