zoukankan      html  css  js  c++  java
  • [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!
    ");
    47             return;
    48         }
    49     }
    50     printf("radixSort() test passed!
    ");
    51 }
    52 
    53 int main(void) {
    54     radixSortTest();
    55     system("pause");
    56     return 0;
    57 }
  • 相关阅读:
    $python打包工具pyinstaller的用法
    $命令行参数解析模块argparse的用法
    $用ConfigParser模块读写conf配置文件
    $用python-docx模块读写word文档
    $git学习总结系列(4)——gitignore文件
    $ git学习总结系列(3)——分支管理
    $ 专治各种python字符编码问题疑难杂症
    $python数据分析基础——初识matplotlib库
    $ python-json模块的基本用法
    $python虚拟化运行环境——virtualenv
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4564530.html
Copyright © 2011-2022 走看看