归并排序(2)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,int left,int right);
	static void Merge(ElemType *arr,int left,int center,int right);

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

#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);
	MSort(arr,0,n-1);
}

void Sort::MSort(ElemType *arr,int left,int right)
{
	//pre:left<right                      //即便n=1时会返回,所以能确保MSort和Merge始终right>left,Merge元素数至少两个
	if (right<=left)                      //注意这里<=,如果是<则会内存耗尽栈溢出
		return;

	int center=(left+right)/2;
	MSort(arr,left,center);
	MSort(arr,center+1,right);
	Merge(arr,left,center,right);         //多传一个center参数,比在Merge内部计算center要好,可以少计算1次
}

void Sort::Merge(ElemType *arr,int left,int center,int right)
{
	//pre:left<right
	ElemType *tmp_arr=new ElemType[right-left+1];    

	//int center=(left+right)/2;
	int i,j,index;
	for (i=left,j=center+1,index=0;i<=center && j<=right;++index)          //index初值设为0
	{
		if (arr[i]<=arr[j])                          
			tmp_arr[index]=arr[i++];
		else
			tmp_arr[index]=arr[j++];
	}

	while (i<=center)
		tmp_arr[index++]=arr[i++];

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

	
	for (i=left,index=0;i<=right;++i,++index)
		arr[i]=tmp_arr[index];

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

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、付费专栏及课程。

余额充值