// Haczynski

void quicksort(int [], int, int);
void sort(int[], int);


void sort(int a[], int SIZE)
/* sort a[lo..hi] */
 { int left, right, median, temp, lo = 0, hi = SIZE-1;

   if( hi > lo ) /* i.e. at least 2 elements, then */
    { left=lo; right=hi;
      median=a[lo];  /* NB. just an estimate! */

      while(right >= left) /* partition a[lo..hi] */
      /* a[lo..left-1] <= median and a[right+1..hi] >= median */
       { while(a[left] < median) left++;
         /* a[left] >= median */

         while(a[right] > median) right--;
         /* a[left] >= median >= a[right] */

         if(left > right) break;

         temp=a[left]; a[left]=a[right]; a[right]=temp; //swap
         left++; right--;
       }
      /* a[lo..left-1] <= median and a[right+1..hi] >= median
         and left > right */

      quicksort(a, lo, right);// divide and conquer
      quicksort(a, left,  hi);
    }
 }/*quicksort*/




void quicksort(int a[], int lo, int hi)
/* sort a[lo..hi] */
 { int left, right, median, temp;

   if( hi > lo ) /* i.e. at least 2 elements, then */
    { left=lo; right=hi;
      median=a[lo];  /* NB. just an estimate! */

      while(right >= left) /* partition a[lo..hi] */
      /* a[lo..left-1] <= median and a[right+1..hi] >= median */
       { while(a[left] < median) left++;
         /* a[left] >= median */

         while(a[right] > median) right--;
         /* a[left] >= median >= a[right] */

         if(left > right) break;

         temp=a[left]; a[left]=a[right]; a[right]=temp; //swap
         left++; right--;
       }
      /* a[lo..left-1] <= median and a[right+1..hi] >= median
         and left > right */

      quicksort(a, lo, right);// divide and conquer
      quicksort(a, left,  hi);
    }
 }/*quicksort*/



