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 }
  • 相关阅读:
    java实验二
    实验1
    响应式站点设计之使用指南
    掌管一个网站?给你九条忠告
    在本地App上设计Web代码
    订阅
    下载站焦点图
    个性化电影频道js
    展开收起播放列表
    onoff组件
  • 原文地址:https://www.cnblogs.com/jcliBlogger/p/4564530.html
Copyright © 2011-2022 走看看