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 }
  • 相关阅读:
    Support依赖库大全
    反射调用泛型
    会爬行的小乌龟
    改进版——使用了双缓冲技术
    启动运行发现窗体不能最大化,添加
    添加图层
    实现放大,缩小,漫游,复位等功能
    从上一个项目中我得到的反思
    ​Error -4075: File not found. An error occurred merging module <MODULENAME> for feature <FEATURENAME>.
    总结—angularjs项目
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4564530.html
Copyright © 2011-2022 走看看