归并排序

归并排序,递归,直到只含有一个数据。

#include <iostream>
#include <time.h>
//tdw
using namespace std;

int adata[100] = {0};//测试数据
int atemp[100] = { 0 };//辅助的数组
void MergerArray(int nfirst, int nmid, int nlast)//合并已经排好的数组
{
	int i = nfirst;//第一个数组的起始
	int j = nmid + 1;//第二个数组的起始
	int m = nmid;//第一个数组的个数
	int n = nlast;//第二个数组的个数
	int k = 0;//
	while (i <= m && j <= n)
	{
		if (adata[i] <= adata[j])
			atemp[k++] = adata[i++];
		else
			atemp[k++] = adata[j++];
	}
	while (i <= m)
	{
		atemp[k++] = adata[i++];
	}
	while (j <= n)
	{
		atemp[k++] = adata[j++];
	}
	for (int i = 0; i < k; ++i)
	{
		adata[nfirst + i] = atemp[i];
	}
}
void MergerSort(int nfirst, int nlast)//归并排序
{
	if (nfirst < nlast)
	{
		int nmid = (nfirst + nlast) / 2;
		MergerSort(nfirst, nmid);//前半部分
		MergerSort(nmid+1, nlast);//后半部分
		MergerArray(nfirst, nmid, nlast);//前后两部分排好序,再合并
	}
}
int main()
{
	srand(time(0));	
	for (int i = 0;i < 100;++i)
	{
		adata[i] = i+1;
	}
	for (int i = 0; i < 100;++i)
	{
		int temp = rand() % 100;
		swap(adata[i], adata[temp]);//随机打乱
	}

	for (int i = 0; i < 100; ++i)
	{
		cout << adata[i] << " ";//原数据
	}
	cout << endl;
	MergerSort(0,99);
	for (int i = 0; i < 100;++i)
	{
		cout << adata[i] << " ";//排序后数据
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值