radix sort
C Program to Implement Radix Sort
Radix Sort
By Eric Suh
Radix Sort is a clever and intuitive little sorting algorithm. Radix Sort puts the elements in order by comparing the digits of the numbers. I will explain with an example.
Consider the following 9 numbers:
493 812 715 710 195 437 582 340 385
We should start sorting by comparing and ordering the one's digits:
Digit | Sublist |
---|---|
0 | 340 710 |
1 | |
2 | 812 582 |
3 | 493 |
4 | |
5 | 715 195 385 |
6 | |
7 | 437 |
8 | |
9 |
Notice that the numbers were added onto the list in the order that they were found, which is why the numbers appear to be unsorted in each of the sublists above. Now, we gather the sublists (in order from the 0 sublist to the 9 sublist) into the main list again:
340 710 812 582 493 715 195 385 437
Note: The order in which we divide and reassemble the list is extremely important, as this is one of the foundations of this algorithm.
Now, the sublists are created again, this time based on the ten's digit:
Digit | Sublist |
---|---|
0 | |
1 | 710 812 715 |
2 | |
3 | 437 |
4 | 340 |
5 | |
6 | |
7 | |
8 | 582 385 |
9 | 493 195 |
Now the sublists are gathered in order from 0 to 9:
710 812 715 437 340 582 385 493 195
Finally, the sublists are created according to the hundred's digit:
Digit | Sublist |
---|---|
0 | |
1 | 195 |
2 | |
3 | 340 385 |
4 | 437 493 |
5 | 582 |
6 | |
7 | 710 715 |
8 | 812 |
9 |
At last, the list is gathered up again:
195 340 385 437 493 582 710 715 812
And now we have a fully sorted array! Radix Sort is very simple, and a computer can do it fast. When it is programmed properly, Radix Sort is in fact one of the fastest sorting algorithms for numbers or strings of letters.
Here is source code of the C Program to Implement Radix Sort. The C program is successfully compiled and run on a Linux system. The program output is also shown below.
#include<stdio.h>
int getMax(int arr[], int n) { int mx = arr[0]; int i; for (i = 1; i < n; i++) if (arr[i] > mx) mx = arr[i]; return mx; } void countSort(int arr[], int n, int exp) { int output[n]; // output array int i, count[10] = { 0 }; // Store count of occurrences in count[] for (i = 0; i < n; i++) count[(arr[i] / exp) % 10]++; for (i = 1; i < 10; i++) count[i] += count[i - 1]; // Build the output array for (i = n - 1; i >= 0; i--) { output[count[(arr[i] / exp) % 10] - 1] = arr[i]; count[(arr[i] / exp) % 10]--; } for (i = 0; i < n; i++) arr[i] = output[i]; } // The main function to that sorts arr[] of size n using Radix Sort void radixsort(int arr[], int n) { int m = getMax(arr, n); int exp; for (exp = 1; m / exp > 0; exp *= 10) countSort(arr, n, exp); } void print(int arr[], int n) { int i; for (i = 0; i < n; i++) printf("%d ", arr[i]); } int main() { int arr[100],n,i; n=5; for(i=0;i<n;i++) { scanf("%d",&arr[i]); } radixsort(arr, n); print(arr, n); return 0; }
Output:
$ gcc RadixSort.c $ ./a.out 2 24 45 66 75 90 170 802
0 comments:
Post a Comment