/** * Sort array ar[left,right] using Quicksort method. */ void do_qsort (void *const pbase, size_t n, size_t s, int(*cmp)(const void *,const void *)) { void *pp; long ct, num; if (n <= 1) { return; } /* locate median (also placeds it in pbase[n-1]. */ selectPivotIndex(pbase,n,s,cmp); pp = partition (pbase,n,s,cmp); ct = (long)pp - (long)pbase; num = ct / s; if (ct > minSize*s && ct > s) { do_qsort (pbase, num, s, cmp); } else if (ct > 1) { insertion (pbase, num, s, cmp); } ct = (long)pbase + (n-1)*s - (long)pp; num = ct / s; if (ct > minSize*s && ct > s) { do_qsort (pp+s, num, s, cmp); } else if (ct > 1) { insertion (pp+s, num, s, cmp); } }
int main ( ) { std :: istream_iterator < std :: string > in ( std :: cin ) , out ; std :: vector < std :: string > holder ; std :: copy ( in, out, std :: back_inserter ( holder ) ) ; std :: vector< char const * > ptrs ( holder . size ( ) ) ; std :: transform ( holder . begin ( ) , holder . end ( ) , ptrs . begin ( ) , std :: mem_fn ( & std :: string :: c_str ) ) ; std:: cout << "sorting " << ptrs . size() << " words.\n" ; do_qsort( ptrs ) ; do_qsort( ptrs ) ; do_qsort( ptrs ) ; do_qsort( ptrs ) ; do_qsort( ptrs ) ; do_stdsort( ptrs ) ; do_stdsort( ptrs ) ; do_stdsort( ptrs ) ; do_stdsort( ptrs ) ; do_stdsort( ptrs ) ; std :: copy( holder . begin ( ) , holder . end ( ) , std :: ostream_iterator< std :: string > ( std :: cout , " " ) ) ; return 0 ; }
/* quicksort without small cases, then insertion sort over all. */ void sortPointers (void **vals, int total_elems, int(*cmp)(const void *,const void *)) { do_qsort (vals, cmp, 0, total_elems-1); insertion (vals, cmp, 0, total_elems-1); }
/** Sort by using Quicksort. */ void sortPointers (void **vals, int total_elems, int(*c)(const void *,const void *)) { ar = vals; cmp = c; do_qsort (0, total_elems-1); }
/** * Sort array ar[left,right] using Quicksort method. * The comparison function, cmp, is needed to properly compare elements. */ void do_qsort (int left, int right) { int pivotIndex; if (right <= left) { return; } /* partition */ pivotIndex = partition (left, right); if (pivotIndex-1-left <= minSize) { insertion (left, pivotIndex-1); } else { do_qsort (left, pivotIndex-1); } if (right-pivotIndex-1 <= minSize) { insertion (pivotIndex+1, right); } else { do_qsort (pivotIndex+1, right); } }
/** * Sort array ar[left,right] using Quicksort method. * The comparison function, cmp, is needed to properly compare elements. */ void do_qsort (void **ar, int(*cmp)(const void *,const void *), int left, int right) { int pivotIndex; if (right <= left) { return; } /* partition */ pivotIndex = selectPivotIndex (ar, left, right); pivotIndex = partition (ar, cmp, left, right, pivotIndex); if (pivotIndex-1-left <= minSize) { insertion (ar, cmp, left, pivotIndex-1); } else { do_qsort (ar, cmp, left, pivotIndex-1); } if (right-pivotIndex-1 <= minSize) { insertion (ar, cmp, pivotIndex+1, right); } else { do_qsort (ar, cmp, pivotIndex+1, right); } }
/** * numElements is there */ void sortValues (void *const pbase, size_t total_elems, size_t size, int(*cmp)(const void *,const void *)) { do_qsort (pbase, total_elems, size, cmp); #ifdef VALIDATE /* validate! */ for (j = 0; j < numElements-1; j++) { if (cmp (pbase +j*size, pbase+(j+1)*size) > 0) { printf ("failed on trial %d\n", j); return; } } #endif }
int main (int argc, char **argv) { long ar[] = {15,9,8,1,4,11,7,12,13,6,5,3,16,2,10,14}; int i; int n = 16; if (argc >1) { srandom (atoi(argv[1])); } dot_header("QuickSort"); do_qsort (1, ar, cmp, 0, n-1); dot_trailer(); for (i = 0; i < 15; i++) { assert (ar[i] <= ar[i+1]); } return 0; }