归并排序

本文介绍了一个使用C++实现的归并排序算法。该程序通过随机生成整数数组,并利用归并排序进行升序排列,展示了排序过程。文章包含了完整的源代码,便于读者理解和实践。
#include <iostream>
#include <time.h>
using namespace std;

void Merge( int* _arr, int p, int q, int r ); 
void MergeSort( int* _arr, int p, int r );
void Print( int* _arr, int _num );
int main()
{
	srand(time(NULL));
	int m = 0, Index = 0;
	scanf("%d",&m);
	int* arr = (int*)malloc( m * sizeof(int) );
	while( Index < m )
	{
		arr[Index] = rand();
		++Index;
	}
	printf("归并排序前\n");
	Print(arr,m);
	MergeSort( arr, 0, Index-1);
	printf("归并排序后\n");
	Print(arr,m);
	free(arr);
	system("pause");
}

void MergeSort( int* _arr, int p, int r )
{
	int q;
	if( p < r )
	{
		q = (int)((p+r) / 2);
		MergeSort( _arr, p, q );		//_arr[p,q]排序
		MergeSort( _arr, q+1, r);		//_arr[q+1,r]排序
		Merge( _arr, p, q, r);			//将_arr[p,q]和_arr[q+1,r]合并并排序
	}
}
//将已排序的两部分合并为已排序的新数组 其中p-q和q-r为已排序的
void Merge( int* _arr, int p, int q, int r )
{
	int n1 = q - p + 1;
	int n2 = r - q;
	//将arr[p,q]赋值给arr1,arr[q+1,r]赋值给arr2
	int* arr1 = (int*)malloc( (n1) * sizeof(int) );
	int* arr2 = (int*)malloc( (n2) * sizeof(int) );
	for( int i = 0; i < n1; ++i )
	{
		arr1[i] = _arr[p+i];
	}
	for( int k = 0; k < n2; ++k )
	{
		arr2[k] = _arr[q+k+1];
	}


	//循环比较arr1和arr2中的元素,将较小值放入arr中直到arr1或者arr2中的元素已经比较完毕
	int Index = p,Index1 = 0, Index2 = 0;
	while( Index1 < n1 && Index2 < n2 )
	{
		if( arr1[Index1] < arr2[Index2] )
		{
			_arr[Index] = arr1[Index1];
			Index++;
			Index1++;
		}
		else
		{
			_arr[Index] = arr2[Index2];
			Index++;
			Index2++;
		}
	}
	
	//将arr1或者arr2中剩余的元素放入arr中
	while( Index1 < n1 )
	{
		_arr[Index] = arr1[Index1];
		Index++;
		Index1++;
	}
	while( Index2 < n2 )
	{
		_arr[Index] = arr2[Index2];
		Index++;
		Index2++;
	}


	free(arr1);
	free(arr2);
}

void Print( int* _arr, int _num )
{
	for( int i = 0; i < _num; ++i )
	{
		printf("%d ",_arr[i]);
	}
	printf("\n");
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值