[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.

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 }
目录
相关文章
|
6月前
|
搜索推荐 算法 Java
sort-08-counting sort 计数排序
这是一个关于排序算法的系列文章摘要。文章详细介绍了多种排序算法,包括冒泡排序、快速排序、选择排序、堆排序、插入排序、希尔排序、归并排序、计数排序、桶排序以及大文件外部排序。计数排序是一种线性时间复杂度的稳定排序算法,由 Harold H. Seward 在1954年提出。基础版计数排序通过创建一个与最大元素等长的新数组来统计每个元素出现的次数,然后填充排序结果。改良版则考虑了空间浪费问题,通过找出最小值来减少数组长度。此外,还提出了使用 TreeMap 来扩展排序算法以适应非数字元素的情况。
|
存储 算法 Java
基数排序详解(Radix sort)
基数排序详解(Radix sort)
115 0
|
搜索推荐 JavaScript 前端开发
基数排序(Radix Sort)
基数排序(Radix Sort)是一种非比较排序算法,它根据数字的每一位(从最低位到最高位)进行排序,具体来说,它是将所有待排序的数字统一为同样的数位长度,然后从最低位开始,依次对每个数位进行排序,最后将所有数字按照数位从低到高的顺序合并成一个有序数组。
66 6
|
算法 搜索推荐
经典算法之折半插入排序(Binary Insertion Sort)
经典算法之折半插入排序(Binary Insertion Sort)
319 0
|
索引
LeetCode 368. Largest Divisible Subset
给出一个由无重复的正整数组成的集合,找出其中最大的整除子集,子集中任意一对 (Si,Sj) 都要满足:Si % Sj = 0 或 Sj % Si = 0。 如果有多个目标子集,返回其中任何一个均可。
77 0
LeetCode 368. Largest Divisible Subset
|
算法 Java
简单选择排序(Simple Selection Sort)
算法介绍 算法描述 动图演示 算法分析 代码实现 算法优化 参考
简单选择排序(Simple Selection Sort)
Data Structures and Algorithms (English) - 6-10 Sort Three Distinct Keys(30 分)
Data Structures and Algorithms (English) - 6-10 Sort Three Distinct Keys(30 分)
104 0
|
C++
Data Structures and Algorithms (English) - 6-9 Sort Three Distinct Keys(20 分)
Data Structures and Algorithms (English) - 6-9 Sort Three Distinct Keys(20 分)
113 0
Data Structures and Algorithms (English) - 6-13 Topological Sort(25 分)
Data Structures and Algorithms (English) - 6-13 Topological Sort(25 分)
109 0
Leetcode-Hard 4. Median of Two Sorted Arrays
Leetcode-Hard 4. Median of Two Sorted Arrays
99 0