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