/**************************************************************** **** **** This file belongs with the course **** Introduction to Scientific Programming in C++/Fortran2003 **** copyright 2016-2022 Victor Eijkhout eijkhout@tacc.utexas.edu **** **** quickit.cxx : quicksort with iterators **** ****************************************************************/ #include using std::cin,std::cout,std::endl; #include using std::ostream; #include using std::function; #include using std::default_random_engine,std::uniform_int_distribution; #include using std::vector; ostream& operator<<( ostream& s,const vector& v ) { s << "["; for ( auto e : v ) s << e << ","; s << "]"; return s; } vector picks( vector::iterator begin,vector::iterator end, function< bool(int) > pick ) { vector copied; for ( auto it=begin; it!=end; ++it ) if (pick(*it) ) copied.push_back( *it ); return copied; } void quicksort( vector::iterator begin,vector::iterator end ) { if (distance(begin,end)==1) { cout << *begin << '\n'; return; } else if (distance(begin,end)==0) { return; } auto median_value = *begin; int count_small{0},count_median{0},count_large{0}; for_each( begin,end, [&count_small,&count_median,&count_large,median_value] ( int value ) { if (valuemedian_value) ++count_large; else count_median; } ); auto red = begin, white = begin+count_small, blue = white+count_median, orange = end; redwhiteblue( red,white,blue,orange ); if (true) { auto red_ptr=red,white_ptr=white,blue_ptr=blue; while ( red_ptr!=white && white_ptr!=blue && blue_ptr!=orange ) { while (*red_ptrmedian_value) blue_ptr++; if (*red_ptr==median and *white_ptrmedian and *blue_ptrmedian) { auto t = *white_ptr; *white_ptr = *blue_ptr; *blue_ptr = t; } } } else { auto small = picks( begin,end, [median_value] (int x ) -> bool { return x bool { return x==median_value; } ); cout << "median: " << median << '\n'; auto big = picks( begin,end, [median_value] (int x ) -> bool { return x>median_value; } ); cout << "big: " << big << '\n'; quicksort( small.begin(),small.end() ); quicksort( big.begin(),big.end() ); } quicksort( small.begin(),small.end() ); quicksort( big.begin(),big.end() ); } int main() { int nvalues = 25; default_random_engine generator; uniform_int_distribution<> distribution(1,nvalues); vector values(nvalues); for ( auto& v: values ) v = distribution(generator); quicksort(values.begin(),values.end()); return 0; }