归并排序(2)MergeSort临时分配内存
2012-04-30 02:06
204 查看
merge_sort.h
merge_sort.cc
utility.h
main.cc
/*----------------------------------------------- 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; }
相关文章推荐
- 临时变量在内存中的地址分配
- 归并排序(1)MergeSort顺序实现之非递归预分配内存
- 关于临时变量内存分配和动态内存分配
- 如何简化临时内存的分配与释放
- 更改内存分配策略改善归并排序效率
- C++的内存分配问题
- C++内存分配方式详解——堆、栈、自由存储区、全局/静态存储区和常量存储区
- 垃圾收集器和内存分配策略
- Java中内存分配相关知识收集
- JAVA虚拟机内存分配与回收机制
- Android内存分配的注意事项
- LCC编译器的源程序分析(68)内存分配链表
- 流驱动XXX_Init中分配内存引起的问题
- 内存分配的方式及特点分析
- C++中类对象的内存空间分配
- C++内存分配方式详解
- 结构体内存分配问题
- Java虚拟机内存分配原则--堆和栈
- 明晰C++内存分配的五种方法的区别
- SQL SERVER 内存分配及常见内存问题(2)——DMV查询