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

来源:互联网 发布:win10 mac地址 编辑:程序博客网 时间:2024/06/16 16:04

若有错误,诚请指正


merge_sort.h


/*-----------------------------------------------  Created By EverSteins  Email:EverSteins@gmail.com 转载请注明出处 ------------------------------------------------*/   #ifndef MERGE_SORT_H#define MERGE_SORT_Htypedef 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>=1assert(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<rightElemType *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++];elsetmp_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 NDEBUGPrintMergeArray(arr,left,right);                  //用于测试合并后的结果#endifdelete[] 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;
}








原创粉丝点击