/* * UCF, CS, Erik Reinhard, Oct 15, 2003 * * Radix sort algorithm */ #include #include #include #include #define DEBUG 1 /* Set this to 1 to see extra print statements */ #define MAX_VALUE 32 /* Maximum value in array, just to comput #bits */ #define N 16 /* Number of elements in array */ unsigned int A[N]; void print () { int i; fprintf (stderr, "\nArray: "); for (i = 0; i < N; i++) fprintf (stderr, "%i ", A[i]); fprintf (stderr, "\n\n"); } void swap (int i, int j) { unsigned int value; value = A[i]; A[i] = A[j]; A[j] = value; } int partition (int start, int end, int bit) { int i = start; int j = end; while (i < j) { while ((i < end) && !(A[i] & (1 << bit))) i++; while ((j >= i) && (A[j] & (1 << bit))) j--; if (i < j) swap (i, j); } // Output for debugging purposes #if DEBUG fprintf (stderr, "Bit %i (%i %i)\t%i:\t ", bit, start, end, j); for (i = 0; i < N; i++) if ((i < start) || (i > end)) fprintf (stderr, "_ "); else fprintf (stderr, "%i ", (A[i] & (1 << bit)) > 0); fprintf (stderr, " "); for (i = 0; i < N; i++) fprintf (stderr, "%i ", A[i]); fprintf (stderr, "\n"); #endif return j; } void radix_sort (int start, int end, int bit) { if (bit >= 0) { int split = partition (start, end, bit); if (start < split) radix_sort (start, split, bit-1); if (split < end) radix_sort (split+1, end, bit-1); } } int main () { int i; int max_bits = 0; // Randomize array for (i = 0; i < N; i++) A[i] = drand48() * MAX_VALUE; print (); // Compute how many bits we need to sort i = MAX_VALUE; // Maximum value of elements in array while (i >>= 1) // Divide by 2 max_bits++; // Increase number of bits #if DEBUG fprintf (stderr, "Bit (start, end) split: bit_values array_values\n\n"); #endif // Sort array radix_sort (0, N-1, max_bits); // Print array print (); #if DEBUG fprintf (stderr, "max bits = %i\n", max_bits); #endif return 0; }