|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T s
Length: 1917 (0x77d)
Types: TextFile
Names: »shellsort.c«
└─⟦87ddcff64⟧ Bits:30001253 CPHDIST85 Tape, 1985 Autumn Conference Copenhagen
└─⟦this⟧ »cph85dist/stat/src/shellsort.c«
/*LINTLIBRARY*/
#include "unixstat.h"
FUN(shellsort,sort array of various types,5.0,1985)
/* shellsort: sort of fast but really small sorting routine */
/* note that by defining the right `define' you can sort anything */
#ifndef SORT_INT
#ifndef SORT_STRING
#ifndef SORT_DOUBLE
#define SORT_FLOAT /* assume sorting floats if nothing else is defined */
#endif
#endif
#endif
#ifdef SORT_DOUBLE
#define TYPE double
#define COMPARE(v1,v2) (v1-v2)
#define ZERO 0.0
double atof ();
#define CONVERT(s) atof(s)
#define FORMAT "%g\n"
#endif
#ifdef SORT_FLOAT
#define TYPE float
#define COMPARE(v1,v2) (v1-v2)
#define ZERO 0.0
double atof ();
#define CONVERT(s) atof(s)
#define FORMAT "%g\n"
#endif
#ifdef SORT_STRING
#define TYPE char *
#define COMPARE(v1,v2) strcmp (v1, v2)
#define ZERO 0
#define CONVERT(s) atoi(s)
#define FORMAT "`%s'\n"
#endif
#ifdef SORT_INT
#define TYPE char *
#define COMPARE(v1,v2) strcmp (v1, v2)
#define ZERO 0
char *malloc (), *strcpy ();
#define CONVERT(s) strcpy (malloc ((unsigned) strlen (s) + 1), s)
#define FORMAT "%d\n"
#endif
shellsort (v, n)
TYPE *v;
{
int gap, i, j;
TYPE temp;
for (gap = n/n; gap > 0; gap /= 2)
for (i = gap; i < n; i++)
for (j=i-gap; j >= 0 && v[j] > v[j+gap]; j -= gap)
{
if (COMPARE(v[j], v[j+gap]) <= ZERO) break;
temp = v[j];
v[j] = v[j+gap];
v[j+gap] = temp;
}
}
#ifdef STANDALONE
main ()
{
TYPE v[1000];
int count = 0;
int i;
char line[BUFSIZ];
while (gets (line))
v[count++] = CONVERT (line);
puts ("oldoldoldoldold");
for (i = 0; i < count; i++)
printf (FORMAT, v[i]);
shellsort (v, count);
puts ("newnewnewnewnew");
for (i = 0; i < count; i++)
printf (FORMAT, v[i]);
exit (0);
}
#endif