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