[Algorithms] Radix Sort

Radix sort is another linear time sorting algorithm. It sorts (using another sorting subroutine) the numbers from their least significant digits to most significant digits. To guarantee the correctness of radix sort, the sorting subroutine must be stable. Moreover, each digit falls in a fixed range. For example, if the numbers are decimal, then all digits fall in [0, 9]. So counting sort is usually used as the subroutine.

The code is as follows. For more on radix sort, please refer to Introduction to Algorithms, 3rd edition.

 1 #include <iostream>
 2 #include <vector>
 3 #include <ctime>
 4 #include <algorithm>
 5 
 6 using namespace std;
 7 
 8 int maximum(vector<int>& nums) {
 9     int mx = nums[0];
10     for (int i = 1; i < (int)nums.size(); i++)
11         mx = max(mx, nums[i]);
12     return mx;
13 }
14 
15 void countingSort(vector<int>& nums, int sig) {
16     vector<int> counts(10, 0);
17     for (int i = 0; i < (int)nums.size(); i++)
18         counts[nums[i] / sig % 10]++;
19     for (int i = 1; i < 10; i++)
20         counts[i] += counts[i - 1];
21     vector<int> sorted(nums.size());
22     for (int i = nums.size() - 1; i >= 0; i--) {
23         sorted[counts[nums[i] / sig % 10] - 1] = nums[i];
24         counts[nums[i] / sig % 10]--;
25     }
26     swap(nums, sorted);
27 }
28 
29 void radixSort(vector<int>& nums) {
30     int mx = maximum(nums);
31     for (int sig = 1; mx / sig; sig *= 10)
32         countingSort(nums, sig);
33 }
34 
35 void radixSortTest(void) {
36     int len = 1000;
37     vector<int> nums(len);
38     srand((unsigned)time(NULL));
39     for (int i = 0; i < (int)nums.size(); i++)
40         nums[i] = rand() % (len + 1);
41     vector<int> copy = nums;
42     radixSort(nums);
43     sort(copy.begin(), copy.end());
44     for (int i = 0; i < (int)nums.size(); i++) {
45         if (nums[i] != copy[i]) {
46             printf("radixSort() test failed!\n");
47             return;
48         }
49     }
50     printf("radixSort() test passed!\n");
51 }
52 
53 int main(void) {
54     radixSortTest();
55     system("pause");
56     return 0;
57 }
posted @ 2015-06-09 20:48  jianchao-li  阅读(286)  评论(0编辑  收藏  举报