归并排序(1)MergeSort顺序实现之非递归预分配内存

若有错误,诚请指正


merge_sort.h


/*-----------------------------------------------  
Created By EverSteins  
Email:EverSteins@gmail.com 
转载请注明出处 
------------------------------------------------*/   
#ifndef MERGE_SORT_H
#define MERGE_SORT_H

typedef int ElemType;

class Sort
{
public:
	static void MergeSort(ElemType *arr,const int n);

	static void PrintArray(const ElemType *arr,const int n);                   //用于测试

private:
	static void MSort(ElemType *arr,ElemType *tmp_arr,int left,int right);
	static void Merge(ElemType *arr,ElemType *tmp_arr,int left,int center,int right);

#ifndef NDEBUG
	static void PrintMergeArray(const ElemType *arr,int left,int right);       //用于测试
#endif

#define DISALLOW_COPY_AND_ASSIGN(TypeName) \
  TypeName(const TypeName&);               \
  void operator=(const TypeName&)

	DISALLOW_COPY_AND_ASSIGN(Sort);

#undef DISALLOW_COPY_AND_ASSIGN
};

#endif

merge_sort.cc

/*-----------------------------------------------  
Created By EverSteins  
Email:EverSteins@gmail.com 
转载请注明出处 
------------------------------------------------*/   
#include "stdafx.h"
#include <iostream>
#include "utility.h"
#include "merge_sort.h"
using namespace std;

void Sort::MergeSort(ElemType *arr,const int n)
{
	//采用一次性分配内存空间,比如非预分配版本在时间性能上能快一些
	//pre:n>=1
	assert(n>=1);
	ElemType *tmp_arr=new ElemType[n];
	MSort(arr,tmp_arr,0,n-1);
	delete[] tmp_arr;             //别忘了释放
}

void Sort::MSort(ElemType *arr,ElemType *tmp_arr,int left,int right)
{
	if (left<right)
	{
		int middle=(left+right)/2;
		MSort(arr,tmp_arr,left,middle);
		MSort(arr,tmp_arr,middle+1,right);
		Merge(arr,tmp_arr,left,middle,right);
	}
	
}

void Sort::Merge(ElemType *arr,ElemType *tmp_arr,int left,int middle,int right)
{
	int index,i,j;                                                        //for循环肯定会进入
	for (i=left,j=middle+1,index=left;i<=middle && j<=right;++index)         //注意index的初始值是left
	{
		if (arr[i]<arr[j])                     
			tmp_arr[index]=arr[i++];
		else
			tmp_arr[index]=arr[j++];
	}

	while (i <= middle)
		tmp_arr[index++] = arr[i++];
	
	while (j <= right)                          
		tmp_arr[index++] = arr[j++];
	
	for (i=left;i<=right;++i)
		arr[i]=tmp_arr[i];

#ifndef NDEBUG
	PrintMergeArray(arr,left,right);             //用于测试合并后的结果
#endif
}

void Sort::PrintArray(const ElemType *arr,const int n)               
{
	for (int i=0;i<n;++i)
		cout<<arr[i]<<' ';
	cout<<endl;
}


void Sort::PrintMergeArray(const ElemType *arr,int left,int right) 
{
	cout<<"After Merge "<<left<<'-'<<right<<':';

	while (left<=right)
	{
		cout<<arr[left]<<',';
		left++;
	}

	cout<<endl;
}

main.cc

/*-----------------------------------------------  
Created By EverSteins  
Email:EverSteins@gmail.com 
转载请注明出处 
------------------------------------------------*/   

#include "stdafx.h"
#include <iostream>
#include "utility.h"
#include "merge_sort.h"
using namespace std;

typedef int ElemType;


int _tmain(int argc, _TCHAR* argv[])
{
	int arr[]={1999,198,90,73,46,-103};
	int n=sizeof(arr)/sizeof(arr[0]);

	cout<<"Before MergeSort:";
	Sort::PrintArray(arr,n);

	Sort::MergeSort(arr,n);

	cout<<"After MergeSort:";
	Sort::PrintArray(arr,n);

	system("pause");
	return 0;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值