template <typename Object, typename Sequence> class MergeSort { protected: // utility functions void merge(Sequence& S1, Sequence& S2, Sequence& S); // merge utility void appendFirst(Sequence& src, Sequence& dst) { // append utility Object obj = src.first().element(); // first of source src.remove(src.first()); // remove it dst.insertLast(obj); // append to dest } public: void mergeSort(Sequence& S); // merge sort S }; template <typename Object, typename Sequence> void MergeSort<Object, Sequence>:: merge(Sequence& S1, Sequence& S2, Sequence& S) { // merge S1 and S2 to S while(!S1.isEmpty() && !S2.isEmpty()) // until either is empty if(S1.first().element() <= S2.first().element()) // copy smaller element appendFirst(S1, S); else appendFirst(S2, S); while(!S1.isEmpty()) // copy remainder of S1 appendFirst(S1, S); while(!S2.isEmpty()) // copy remainder of S2 appendFirst(S2, S); } template <typename Object, typename Sequence> void MergeSort<Object, Sequence>:: mergeSort(Sequence& S) { // sort S Sequence S1, S2; int i; int n = S.size(); if (n <= 1) return; // 0 or 1 elements for (i = n ; i > n/2 ; i--) appendFirst(S, S1); // put half in S1 for ( ; i > 0 ; i--) appendFirst(S, S2); // put remainder in S2 mergeSort(S1); // sort S1 mergeSort(S2); // sort S2 merge(S1, S2, S); // merge S1 and S2 into S }