#include <iostream> #include <time.h> #include <cassert> #include <algorithm> #include <map> using namespace std; template <typename T> class List { public: struct Node { Node(const T &val): data(val), next(NULL){} T data; Node *next; }; public: List(): head(NULL), nodeCount(0){} void pushFront(const T &val) { Node *temp = head; head = new Node(val); head->next = temp; nodeCount++; } void pushTail(const T &val) { if (nodeCount == 0) { head = new Node(val); } else { Node *n = head; for (int i = 1; i < nodeCount; i++) n = n->next; n->next = new Node(val); } nodeCount++; } int getNodeCount() { return nodeCount; } /* *Spilt the list to 2 lists with the left one has "leftCount" nodes. *@param leftCount the node count of the left list. *@return The right part list. */ List spilt(int leftCount) { assert(leftCount <= nodeCount); if (leftCount == 0) { List temp; temp.head = head; temp.nodeCount = nodeCount; this->head = NULL; this->nodeCount = 0; return temp; } else { Node *n = head; for (int i = 1; i < leftCount; i++) n = n->next; List temp; temp.head = n->next; temp.nodeCount = nodeCount - leftCount; n->next = NULL; this->nodeCount = leftCount; return temp; } } /* *Two list must has been sorted. *@param list After mergement, list will be a empty list; */ void mergeSortedList(List &list) { Node *a = head; Node *b = list.head; // head node Node *c = new Node(0); Node *headNode = c; while(a && b) { if (a->data <= b->data) { c->next = a; a = a->next; } else { c->next = b; b = b->next; } c = c->next; } if (a != NULL) c->next = a; if (b != NULL) c->next = b; // head = headNode->next; nodeCount += list.nodeCount; list.head = NULL; list.nodeCount = 0; delete headNode; } void print() { Node *p = head; while(p) { cout << p->data << '/t'; p = p->next; } cout << endl; } bool isSorted() { if (nodeCount <= 1) return true; Node *prev = head; Node *cur = prev->next; while(cur) { if (prev->data > cur->data) return false; prev = cur; cur = cur->next; } return true; } T &getFirst() { cur = head; return cur->data; } bool hasNext() { if (cur->next != NULL) return true; else return false; } T &getNext() { cur = cur->next; return cur->data; } private: Node *head; int nodeCount; Node *cur; }; template <typename T> void mergeSort(List<T> &list) { if (list.getNodeCount() <= 1) return; List<T> right = list.spilt(list.getNodeCount() / 2); mergeSort(list); // left part mergeSort(right); // right part list.mergeSortedList(right); } int main() { srand(time(0)); map<int, int> validator; List<int> listA; for (int i = 0; i < 100; i++) { int val = rand() % 1000; listA.pushTail(val); validator[val]++; } listA.print(); mergeSort(listA); listA.print(); // test weather list has been sorted and no element added or removed. assert(listA.isSorted()); map<int, int> validatorB; validatorB[listA.getFirst()]++; while(listA.hasNext()) { validatorB[listA.getNext()]++; } for (map<int, int>::const_iterator i = validator.begin(); i != validator.end(); i++) { assert(validatorB.find(i->first) != validatorB.end()); assert(validatorB[i->first] == i->second); } system("pause"); return 0; }