由于归并排序需要O(n)的额外空间,在普通函数中,我实在想不出好的办法来申请这块内存。于是只好把他写成一个模板类:
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 | #include <iostream> #include <ctime> using namespace std; template <class T> class Merger { public: Merger(T* array, size_t n):extra(new T[n/2]) //~ 归并需要O(n)的额外空间 { sub_Merger(array, n); //~ 调用递归子函数 } ~Merger() { delete [] extra; //~ 释放内存 } private: T* extra; Merger(); void sub_Merger(T* array, size_t n); }; template <class T> void Merger<T>::sub_Merger(T * array, size_t n) { if(n == 1) //~ 递归终止 return ; else if(n == 2) //~ 递归终止 { if( array[0] > array[1] ) { T tmp = array[0]; array[0] = array[1]; array[1] = tmp; } } else { /* 将数组均分为两部分,分别排好,然后归并*/ size_t m = n / 2; //~ 分别排序 sub_Merger(array, m + 1); sub_Merger(array + m + 1, n - m - 1); //~ 归并 size_t i = 0, j = m + 1, k = 0; memcpy(extra, array, (m + 1)* sizeof(T)); while( i <= m && j < n) { array[k++] = extra[i] < array[j] ? extra[i++]:array[j++]; } while(i <= m) { array[k++] = extra[i++]; } } } int main() { srand((unsigned)time(0)); const int N(100); int demo[N]; for(int i = 0; i < N; ++i) { demo[i] = rand()%N; } Merger<int>(demo, N); for(int i = 0; i < N; ++i) cout<<demo[i]<<endl; return 0; } |
如果你有什么好的建议的话,敬请赐教,不胜感激涕零!:)
你好!除了代码,此处没有多少原创之物,皆为本人搜集、整理、总结之记录与心得,欢迎转载分享!转载时请尽量注明出处,将不胜感激。祝你健康、快乐!
Be the first to comment on this entry.