#include #include #include #include using namespace std; typedef std::deque list_t; size_t partition(list_t& lst, size_t left, size_t right, size_t pivot) { if (left == right) return left; list_t::value_type pivot_val = lst[pivot]; swap(lst[pivot], lst[right]); // move pivot to end. size_t store_pos = left; for (size_t i = left; i <= right-1; ++i) { if (lst[i] < pivot_val) { swap(lst[i], lst[store_pos]); ++store_pos; } } swap(lst[store_pos], lst[right]); // Move pivot to its final place. return store_pos; } void quick_sort_run(list_t& lst, size_t left, size_t right) { if (left >= right) return; if (right - left == 1) { // There is only 2 elements. if (lst[left] > lst[right]) swap(lst[left], lst[right]); return; } // There should be at least 3 elements in this segment. size_t pivot = right - left == 2 ? left + 1 : (left+right) / 2; pivot = partition(lst, left, right, pivot); if (pivot == left) { quick_sort_run(lst, left, pivot); quick_sort_run(lst, pivot+1, right); } else { quick_sort_run(lst, left, pivot-1); quick_sort_run(lst, pivot+1, right); } } void quick_sort(list_t& lst) { size_t n = lst.size(); if (n <= 1) // Nothing to do. return; quick_sort_run(lst, 0, n-1); } void print_list(const list_t& lst, const char* caption) { cout << caption << ": "; for (list_t::const_iterator i = lst.begin(), ie = lst.end(); i != ie; ++i) cout << *i << " "; cout << endl; } int main(int argc, char** argv) { if (argc < 2) { cout << "needs at least one argument" << endl; return EXIT_FAILURE; } const char* p = argv[1]; const char* pend = p + strlen(p); char* endptr = NULL; long list_size = strtol(p, &endptr, 10); if (endptr != pend) { cout << "invalid number: " << p << endl; return EXIT_FAILURE; } cout << "list size: " << list_size << endl; list_t lst; for (int i = 0; i < list_size; ++i) { double val = rand(); val /= RAND_MAX; val *= 100; lst.push_back(val); } print_list(lst, "original"); quick_sort(lst); print_list(lst, "sorted"); return EXIT_SUCCESS; }