若有错误,诚请指正
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;
}