您的位置:首页 > 其它

归并排序(2)MergeSort临时分配内存

2012-04-30 02:06 204 查看
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];    //todo:如何减少内存分配和初始化,memset?

//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])                          //注意这里是<=以保持排序后的稳定性,sgi stl这里写arr[j]<arr[i](类似))
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;
}


utility.h

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

#ifndef UTILITY_H
#define UTILITY_H
#include <cstddef>
#include <cstdlib>
#include <cassert>
#include <stdlib.h>

#endif


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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: