/** * Clayton Cafiero * CS 2240 * 05-Jan-2021 */ #include #include template void printVector(const std::vector& v) { for (Comparable item : v) { std::cout << item << " "; } std::cout << std::endl; } /** * Quicksort stable, recursive. This implementation of Quicksort * is stable, but requires more space. Note we have the vectors * smaller, equal, and larger. */ template void quicksortStable(std::vector& v) { // Recursive base case if (v.size() < 2) { return; } Comparable pivot = v[0]; std::vector smaller, equal, larger; int i; // OK to declare here. See where we copy values back to orig. vector for (i = 0; i < v.size(); ++i) { if (v[i] < pivot) { smaller.push_back(v[i]); } else if (v[i] > pivot) { larger.push_back(v[i]); } else { equal.push_back(v[i]); } } quicksortStable(smaller); quicksortStable(larger); // Copy everything back into vector for (i = 0; i < smaller.size(); ++i) { v[i] = smaller[i]; } // Omit initialization of i and continue... for (; i < smaller.size() + equal.size(); ++i) { v[i] = equal[i - smaller.size()]; } // Omit initialization of i and continue... for (; i < v.size(); ++i) { v[i] = larger[i - smaller.size() - equal.size()]; } } int main() { std::vector v = {8, 5, 0, 4, 3, 9, 1, 7, 2, 6}; printVector(v); quicksortStable(v); printVector(v); }