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 }
  • 相关阅读:
    旋转数组的最小数字
    二维数组中的查找问题--剑指offer面试题3
    百度软件开发实习生c++方向面经(一面)
    一些常考的智力题
    灵感闪现 篇 (一) 2d场景 3d 效果
    GameUnity 2.0 文档(四) 网格+四叉树 最优碰撞检测
    GameUnity 2.0 文档(三) 纸片人八方向
    GameUnity 2.0 文档(二) 纸片人系统
    GameUnity 2.0 文档(一) 事件机制
    GameUnity 2.0 发布倒计时
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4564530.html
Copyright © 2011-2022 走看看