归并排序

  • 归并排序是多次将两个或两个以上的有序表合并成一个新的有序表。

归并排序设计思想:

  • 通过“归并”两个或两个以上的记录有序子序列,逐步增加记录有序序列的长度。

  • 内部排序中,通常采用的是2-路归并排序,即:将两个位置相邻的记录有序子序列归并为一个记录的有序序列。
    在这里插入图片描述

  • 注:若有三个有序表进行归并的话,称为3-路归并;
    由k个有序序列进行归并的话就为k-路归并

归并排序的具体分析:

  • 假设初始序列含有n个记录,则可看成是n个有序的子序列,每个字序列的长度为1,然后两两归并,得到 [ n / 2 ] 个长度为1或2的有序子序列,再两两归并…如此重复,直到得到一个长度为n的有序序列为止。

  • 假设待排序列为:
    在这里插入图片描述

  • 第一步:相邻两个元素组合排序
    在这里插入图片描述

  • 第二步:以下均为相邻两个组合进行排序:
    在这里插入图片描述

  • 第三步:
    在这里插入图片描述

  • 第四步:
    在这里插入图片描述

归并排序的代码实现:

#include<stdio.h>
int a[10]={75,87,68,92,88,61,77,96,80,72};
void Merge(int start,int mid,int end)
{
	int b[15]={0};
	int j,k=0;
	int i=start;
	for(j=mid+1;i<=mid&&j<=end;k++)  
	{
		if(a[i]<a[j])
			b[k]=a[i++];
		else
			b[k]=a[j++];
	}
	while(i<=mid)              //将剩余的a[i..mid]复制到b[] 
	{
		b[k++]=a[i++];
	}
	while(j<=end)              //将剩余的a[j..end]复制到b[] 
	{
		b[k++]=a[j++];
	}
	for (j=0,i=start;j<k;i++,j++) //将b[]中排好的元素重新赋给a[start..end] 
	{
		a[i]=b[j];
	}

}
void Msort(int start, int end)
{
	if(start>=end)
		return;
	else
	{
		int mid=(start+end)/2;   //将数组平分为a[start..mid]和a[mid+1..end] 
		Msort(start,mid);        //递归地将a[start..mid]归并为有序的a[stsrt..m] 
		Msort(mid+1,end);        //递归地将a[mid+1..end]归并为有序的a[mid+1..end] 
		Merge(start,mid,end);    //将a[start..mid]和a[mid+1..end]归并到b[start..end] 
	}
}
int main()
{
	Msort(0,9);
	int i;
	for(i=0;i<10;i++)
	{
		printf("%d ",a[i]);
	}
	return 0;
}

二路归并排序算法的性能:

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值