C语言实现二路归并排序

二路归并排序
  1. 实现思想
    • 将两个位置相邻的记录有序子序列归并为一个记录有序的序列。
  2. 时间复杂度
    • 最好情况:O(nlogn)
    • 最坏情况:O(nlogn)
    • 平均时间复杂度:O(nlogn)
  3. 空间复杂度
    • O(n)
  4. 稳定性
    • 稳定
代码
	#include<stdio.h>
	
	void Merge(int tr[],int r[],int i,int m,int n){
		int j,k;
		for(j=m+1,k=i;i<=m&&j<=n;k++){
			if(tr[i]<tr[j])
				r[k]=tr[i++];
			else
				r[k]=tr[j++];
		}
		while(i<=m)
			r[k++]=tr[i++];
		while(j<=n)
			r[k++]=tr[j++];
	}
	
	/*2-路归并排序【r1和r2指向的是同一块内存,对r2进行归并就是对r1进行归并】*/
	void MSort(int r1[],int r2[],int i,int n){
		int m;
		int tr[9];
		if(r1[i]==r1[n])
			r2[i]=r1[i];
		else{
			m=(i+n)/2;
			MSort(r1,tr,i,m);   /*先将r1装到tr*/
			MSort(r1,tr,m+1,n); /*先将r1装到tr*/
			Merge(tr,r2,i,m,n); /*再将tr装到r2【注意不能是r1】*/
		}
	}
	
	void Output(int rcd[],int len){
		int i;
		for(i=1;i<=len;i++){   //从r[1]开始输出,r[0]作为哨兵,不输出
			printf("%d ",rcd[i]);
		}
		printf("\n");
	}
	
	void main(){
		int len=8;  //对8个元素进行排序
		int rcd[9]={0,3,1,7,5,2,4,9,6}; //r[0]不存储元素,r[1]到r[8]存储元素
		printf("未排序的集合为:\n");
		Output(rcd,len);
		MSort(rcd,rcd,1,len);   //2-路归并排序
		printf("从小到大排序后的集合为:\n");
		Output(rcd,len);
	}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值