/**
 * 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);
  }

}
Esempio n. 2
0
File: main.cpp Progetto: CCJY/coliru
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);
  }
}
Esempio n. 6
0
/**
 * 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;
}