#include "refer.h"
void shell(int n, int (*comp)(int,int), void (*exch)(int,int))
/* SORTS UP. IF THERE ARE NO EXCHANGES (IEX=0) ON A SWEEP
THE COMPARISON GAP (IGAP) IS HALVED FOR THE NEXT SWEEP */
{
int igap, iplusg, iex, i, imax;
igap = n;
while (igap > 1) {
igap /= 2;
imax = n - igap;
do
{
iex = 0;
for (i = 0; i < imax; i++) {
iplusg = i + igap;
if ((*comp)(i, iplusg) )
continue;
(*exch)(i, iplusg);
iex = 1;
}
} while (iex > 0);
}
}
|