合并排序是一种外排序算法,其运行时间为O(nlgn),在最坏的情况下要比插入排序O(n²)好。
合并排序步骤:
分解:将n个元素分成各含n/2个元素的子序列;
解决:用合并的排序法对两个子序列递归地排序;
合并:合并两个已排序的子序列以得到排序结果。
在对子序列排序时,其长度为 1 时递归结束。具体思路参考《算法导论》P17页内容。
下面是C++的具体实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | //: mergeSort.h /* Author: Kailash * Contact: http://www.ninthday.net */ #ifndef MERGESORT_H_ #define MERGESORT_H_ #include <iostream> template <class Type> class MergeSort { private: Type* m_head; int m_length; protected: void merge(Type* array, int start, int middle, int end); void mergeSort(Type* array, int start, int end); public: MergeSort(Type* array, int length); MergeSort(Type* array, int length, int start, int end); void show(); Type* getHead(){ return this->m_head; } int getLength(){ return this->m_length; } }; template <class Type> MergeSort<Type>::MergeSort(Type* array, int length) { m_head = array; m_length = length; mergeSort(array, 0, length-1); } template <class Type> MergeSort<Type>::MergeSort(Type* array, int length, int start, int end) { m_head = array; m_length = length; mergeSort(m_head, start-1, end-1); } template <class Type> void MergeSort<Type>::merge(Type* array, int start, int middle, int end) { int n1 = middle-start+1; int n2 = end-middle; int* left = new Type[n1+2]; int* right = new Type[n2+2]; int i, j; for(i=0; i<n1; i++) left[i] = array[start+i]; for(j=0; j<n2; j++) right[j] = array[middle+j+1]; left[n1] = 30000; right[n2] = 30000; left[n1+1] = '\0'; right[n2+1] = '\0'; i = j = 0; for(int k=start; k<=end; k++) { if(left[i]<=right[j]) { array[k] = left[i]; i += 1; } else { array[k] = right[j]; j += 1; } } delete [] left; delete [] right; } template <class Type> void MergeSort<Type>::mergeSort(Type* array, int start, int end) { if(start<end) { int middle = (start+end)/2; mergeSort(array, start, middle); mergeSort(array, middle+1, end); merge(array, start, middle, end); } } template <class Type> void MergeSort<Type>::show() { using namespace std; cout <<endl; for(int i=0;i<m_length;i++) cout <<m_head[i]<<" "; cout <<endl; } #endif |
声明:本文采用 BY-NC-SA 协议进行授权 | 星期九
原创文章转载请注明:转自《C++模板类归并排序》
嗯,很经典的算法
@HaoziLeung,
,我是打酱油的。
过来看看 !
好吧~我对此无感觉~
@Suitear,
,你的博客还是访问不了。
问个问题...object c和c++相同吗?
@混乱博客, Objective-C不支持多重继承,而C++语言支持多重继承。Objective-C是动态定型,所以它的类库比C++要容易操作。它是Mac OS上用的开发语言。具体我也不清楚。
C++ 神马的都忘记了
@小羿, 我也不是很熟的。
Random Posts
Recent Posts
Recent Comments
By Plastic injection mould
By OOZJ
By Jusbe
By 互联网战
By 互联网战
By ixwebhosting
Blogroll
Categories
Tag Cloud
360 5800 Alexa C++ Chrome Cisco Dedecms Discuz Fcitx Fedora GFW Gravatar IE Linux Mobile ModelSim Music QT Quartus Shell Verilog VPN VPS Windows Wordpress XAMPP Xilinx xp 下载 垃圾评论 情感 手机 插件 星期九 注册 电子信息 程序设计 站长工具 缩略图 网络应用 考研 胡思乱想 西工大 视频 软件Meta