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 }
  • 相关阅读:
    NFS(Network File System)即网络文件系统 (转)
    抓包神器 tcpdump 使用介绍 (转)
    sms短信网关对接
    spring 事务的传播级别和隔离级别
    持续集成是什么?
    理解Cookie和Session机制
    使用df -h命令查看磁盘空间使用率不算高,还有很多空余空间,但是创建文件或写入数据时一直报错磁盘写满
    删除文件后,磁盘空间没有释放的处理记录
    Springboot启动原理解析
    使用idea创建springboot项目
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4564530.html
Copyright © 2011-2022 走看看