归并排序(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};#endifmerge_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;
}
- 归并排序(2)MergeSort顺序实现之非预分配内存
- 归并排序(1)MergeSort顺序实现之非递归预分配内存
- 归并排序(2)MergeSort临时分配内存
- 无聊写排序之 ---- 归并排序(MergeSort) 非递归实现
- 归并排序(mergeSort)之非递归算法
- 面试之路(16)-归并排序详解(MergeSort)递归和非递归实现
- 非递归的归并排序(MergeSort)
- 归并排序(Mergesort)之Java实现
- 归并排序(Mergesort)之Java实现
- 归并排序(mergeSort)之递归实现
- 归并排序(Mergesort)之Java实现
- 排序之归并排序(MergeSort)
- MergeSort-归并排序(C++实现)
- MergeSort-归并排序(C++实现)
- MergeSort(归并排序)算法Java实现
- 归并排序(MergeSort)Java实现
- Java实现算法归并排序(MergeSort)
- Java 归并排序(MergeSort)算法实现
- SQL语句执行效率及分析
- Spring中的Advice类型及其应用
- android 处理动画闪烁效果
- 如何让遗失的手机失而复得
- 使用两点经纬度计算距离
- 归并排序(2)MergeSort顺序实现之非预分配内存
- 系统不响应问题的调试
- VB6网络电视V6TV
- gitolite安装
- android 中自定义Dialog的位置和大小的方法
- C#FileStream 和StreamReader结合使用
- C#中StreamWriter应用实例
- iOS cocos2d实现自定义button(按钮特效)控件效果源码
- C#操作IIS完整解析