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

Theory of Combinatorial Algorithms

Prof. Emo Welzl and Prof. Bernd Gärtner

// Programm: quicksort.C // Sortieren eines Vektors von Zahlen mittels Quicksort. #include #include #include #include #include typedef std::vector Vec; typedef Vec::iterator It; typedef Vec::const_iterator Cit; namespace ifet { It split(It b, It e) // PRE: [b,e) ist ein nichtleerer gueltiger range. // POST: Die Elemente in [b,e) wurden permutiert. // Rueckgabewert ist ein s aus [b,e), so dass // fuer alle i in [b,s): v[i] <= pivot, // v[s] == pivot sowie // fuer alle i in (s,e): v[i] > pivot, // wobei pivot == *b beim Aufruf der Funktion. { assert(b != e); It i = b; for (It j = ++i; j != e; ++j) // Invariante: *[b,i) <= *b && *[i,j) > *b. if (*j <= *b) std::swap(*(i++), *j); // Tausche das Pivot-Element in die richtige Position // (am Ende des ersten Blocks) std::swap(*b, *--i); return i; } // split(b, e) void quicksort(It b, It e) // PRE: [b,e) ist ein gueltiger range. // POST: Die Elemente in [b,e) sind aufsteigend sortiert. { if (b == e) return; It mid = ifet::split(b, e); ifet::quicksort(b, mid); ifet::quicksort(++mid, e); } // quicksort(b, e) } // namespace ifet int main() { Vec v; for (int i = 0; i < 5; ++i) { v.push_back(2*i); v.push_back(9-2*i); } // v == (0,9,2,7,4,5,6,3,8,1) // Ausgabe von v std::cout << "v = ("; for (Cit i = v.begin(); i != v.end(); ++i) std::cout << *i << " "; std::cout << ")" << std::endl; // Sortieren ifet::quicksort(v.begin(), v.end()); for (It i = v.begin(); i != v.end(); ++i) std::cout << *i << " "; std::cout << std::endl; return 0; }