Department of Computer Science | Institute of Theoretical Computer Science | CADMO

Theory of Combinatorial Algorithms

Prof. Emo Welzl and Prof. Bernd Gärtner

// Program: sort_array3.C // initialize an array of n numbers in descending // order, and then sort them into ascending order, // using a function (this is for measuring sorting // time) #include #include #include // PRE: [first, last) is a valid range // POST: the elements *p, p in [first, last) are in ascending order void minimum_sort (int* first, int* last) { for (int* p = first; p != last; ++p) { // find minimum in nonempty range described by [p, last) int* p_min = p; // pointer to current minimum int* q = p; // pointer to current element while (++q != last) if (*q < *p_min) p_min = q; // interchange *p with *p_min std::iter_swap (p, p_min); } } // PRE: [first, middle), [middle, last) are valid ranges; in // both of them, the elements are in ascending order void merge (int* first, int* middle, int* last) { int n = last - first; // total number of cards int* deck = new int[n]; // new deck to be built int* left = first; // top card of left deck int* right = middle; // top card of right deck for (int* d = deck; d != deck + n; ++d) // put next card onto new deck if (left == middle) *d = *right++; // left deck is empty else if (right == last) *d = *left++; // right deck is empty else if (*left < *right) *d = *left++; // smaller top card left else *d = *right++; // smaller top card right // copy new deck back into [first, last) int *d = deck; while (first != middle) *first++ = *d++; while (middle != last) *middle++ = *d++; delete[] deck; } // PRE: [first, last) is a valid range // POST: the elements *p, p in [first, last) are in ascending order void merge_sort (int* first, int* last) { int n = last - first; if (n <= 1) return; // nothing to do int* middle = first + n/2; merge_sort (first, middle); // sort first half merge_sort (middle, last); // sort second half merge (first, middle, last); // merge both halfs } int main() { int n = 1600000; // number of values to be sorted int* a = new int[n]; std::cout << "Sorting " << n << " integers...\n"; // create sequence: 0, n-1, 1, n-2,... for (int i=0; i