归并排序

       归并(Merge)排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个有序的子序列,再把有序的子序列合并为整体有序序列。


原理:归并排序具体工作原理如下(假设序列共有n个元素):

将序列每相邻两个数字进行归并操作(merge),形成floor(n/2)个序列,排序后每个序列包含两个元素

将上述序列再次归并,形成floor(n/4)个序列,每个序列包含四个元素

重复步骤2,直到所有元素排序完毕

C++实现代码:

#include <iostream>
using namespace std;

void Merge(int a[],int a1[],int first,int m,int last)
{
	int i=first;
	int j=m+1;
	int k=first;
	while(i<=m&&j<=last)
	{
		if (a[i]<=a[j])
		    a1[k++]=a[i++];
		else
			a1[k++]=a[j++];
	}
	if (i<=m)
	{
		while (i<=m)
		    a1[k++]=a[i++];
	}
	else
	{
		while(j<=last)
			a1[k++]=a[j++];
	}
	int n;
	for (n=first;n<=last;n++)
	{
		a[n]=a1[n];
	}
}
void MergeSort(int a[],int a1[],int first,int last)
{
	if (first<last)
	{
		int m=(first+last)/2;
	    MergeSort(a,a1,first,m);
	    MergeSort(a,a1,m+1,last);
	    Merge(a,a1,first,m,last);
	}
}
int _tmain(int argc, _TCHAR* argv[])
{
	int arr[8]={10,3,5,1,9,34,54,565};
	int arr1[8];
	MergeSort(arr,arr1,0,7);
	int i;
	for (i=0;i<8;i++)
	{
		cout<<arr[i]<<" ";
	}
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值