1 /*  hsort.c    CCMATH mathematics library source code.
2  *
3  *  Copyright (C)  2000   Daniel A. Atkinson    All rights reserved.
4  *  This code may be redistributed under the terms of the GNU library
5  *  public license (LGPL). ( See the lgpl.license file for details.)
6  * ------------------------------------------------------------------------
7  */
8 #define Swap(x,y) (tmp=(x),(x)=(y),(y)=tmp)
9 static void rheap(void **v,int k,int n,int (*comp)());
hsort(void ** v,int n,int (* comp)())10 void hsort(void **v,int n,int (*comp)())
11 { int k; char *tmp;
12   for(k=n/2-1; k>=0 ;) rheap(v,k--,n,comp);
13   for(--n; n>0 ;){ Swap(v[0],v[n]); rheap(v,0,n--,comp);}
14 }
rheap(void ** v,int k,int n,int (* comp)())15 static void rheap(void **v,int k,int n,int (*comp)())
16 { int m=n-1,j; char *tmp;
17   for(j=2*k+1; j<n ;k=j,j=2*k+1){
18     if(j<m && (*comp)(v[j+1],v[j])>0) ++j;
19     if((*comp)(v[j],v[k])>0) Swap(v[k],v[j]);
20     else break;
21    }
22 }
23