分治法合并排序

分治法合并排序

// 归并排序 
#include<iostream>
#include<cstdlib>
#include<ctime>
#include<algorithm>
#include <iomanip>
#define N 8
using namespace std;

// 打印输出 
void print(int *arr,int n)
{
	for(int i = 0;i < n;++i)
	{
		cout<<*(arr+i)<<" ";
	}
	cout<<endl;
}

void Merge(int* arr,int* tempArr,int s,int m,int e)
{
	int i = s,j = m+1,k = s;
	while(i <= m && j <= e)
	{
		if(arr[i] <= arr[j] )
			tempArr[k++] = arr[i++];
		else
			tempArr[k++] = arr[j++];
	}
	while(i<=m) tempArr[k++] = arr[i++];
	while(j<=e) tempArr[k++] = arr[j++];
	for(int index = s;index <=e;++index)
	{
		arr[index] = tempArr[index];
	}
}

void MergeSort(int* arr,int s,int e)
{
	int tempArr[1000] = {0};
	if(s == e) return;	// 仅含有一个元素,单个元素有序,结束排序 
	// 设置中间指针m,这样我们有头指针,中间指针,尾指针 
	int m = (s + e)/2; 	
	MergeSort(arr,s,m);
	MergeSort(arr,m+1,e);
	Merge(arr,tempArr,s,m,e);
}

// 用std::sort()进行测试归并排序的正确性 
void testMergeSort()
{
	srand((int)time(NULL));	// 利用系统时钟,生成不同的随机数种子 
	int flag = 1;
	int length; 		
	int* arr1,*arr2;
	int times = 10000;			// 测试的次数 
	for(int i = 0;i<times;++i)
	{
		flag  = 1;
		length = rand()% 21 + 10;		//随机生成长度为10-30之间的数作为数组的长度 
		arr1 = (int *)malloc(sizeof(int)*length);			
		arr2 = (int *)malloc(sizeof(int)*length);
		for(int i = 0;i < length;++i)
		{
			arr1[i] = rand()%24;	
		}
		copy(arr1,arr1+length,arr2);		// 浅拷贝
		cout<<"第"<<setw(4)<<i+1<<"个样例:"; 
		print(arr1,length);
		MergeSort(arr1,0,length-1);
		sort(arr2,arr2+length);
		for(int j = 0;j<length;++j)
		{
			if(arr1[j]!=arr2[j])
			{
				flag = 0;	
				break;
			}
	    }
	    if(flag == 0) break;
	    else cout<<"通过======================================================================="<<endl;
	    free(arr1);arr1 = NULL;		// 释放内存 
	    free(arr2);arr2 = NULL;		// 释放内存 
	}
	if(flag == 1) cout<<times<<"个测试全部通过"<<endl;
	else {
		cout<<"样例未通过测试:"<<endl;
		free(arr1);arr1 = NULL;		// 释放内存 
	    free(arr2);arr2 = NULL;
	} 
} 

int main()
{ 
	int* arr = (int *)malloc(sizeof(int)*N);
	srand((int)time(NULL));	// 利用系统时钟,生成不同的随机数种子  
	for(int i = 0;i < N;++i)
	{
		arr[i] = rand()%20;	// 生成 1-10之间的随机数为*(arr+i)赋值 
	}
	cout<<"排序前,数组为:"<<endl;
	print(arr,N); 

//	cout<<"排序过程:"<<endl; 
	MergeSort(arr,0,N-1);

	cout<<"排序后的结果:"<<endl;
	print(arr,N); 
	free(arr);
	arr = NULL; 
	// 测试 
//	testMergeSort();	
	return 0;	
} 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值