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

#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.是一种稳定的排序方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值