zoukankan      html  css  js  c++  java
  • [经典算法]基数排序

    概述:

    基数排序是一种高效的线性排序算法。其方法是将数据按位分开,并从数据的最低有效位到最高有效位进行比较,依次排序,从而得到有序数据集合。

    例子:

    用基数排序对十进制数据{15,12,49,16,36,40}进行排序。

    在对个位数排序之后=> {40,12,15,16,36,49};

    在对十位数排序之后=> {12,15,16,36,40,49};

    有一点非常重要,在对每一位数值进行排序时其排序过程必须是稳定的。

     

    程序代码:

    #include <gtest/gtest.h>
    #include <algorithm>
    using namespace std;
    
    void RxSort(int* data, int size, int p, int k)
    {
        int* counts = new int[k];
        int* sorted = new int[size];
        
        for (int n=0; n<p; n++)
        {
            memset(counts, 0, sizeof(int)*k);
            int qval = (int)pow((double)k, (double)n);
            
            // 计数排序
            for (int i=0; i<size; ++i)
            {
                counts[(int)(data[i]/qval) % k]++;
            }
    
            for (int i=1; i<k; ++i)
            {
                counts[i] += counts[i-1];
            }
    
            for (int i=size-1; i >=0; --i)
            {
                int index = (int)(data[i]/qval) % k;
                counts[index]--;
                sorted[counts[index]] = data[i];
            }
    
            memcpy(data, sorted, sizeof(int)*size);
            // 计数排序 End
        }
    
        delete[] counts;
        delete[] sorted;
    }
    
    // 辅助函数
    template<typename T>
    static void ShowElem(T& val)
    {
        cout << val << " ";
    }
    
    template<typename T>
    static bool Validate(T* data, int len)
    {
        for (int i=0; i < len-1; ++i)
        {
            if (data[i] > data[i+1])
            {
                return false;
            }
        }
    
        return true;
    }
    
    //测试代码
    TEST(Algo, tCountSort)
    {    
        int d1[] = {2,82,73,11,12,85,6,4};
        RxSort(d1, 8, 2, 10);
        for_each(d1, d1+8, ShowElem<int>);    
        ASSERT_TRUE(Validate(d1,8));    
        cout << endl;
    
        int d2[] = {2};
        RxSort(d2, 1, 1, 10);
        for_each(d2, d2+1, ShowElem<int>);
        ASSERT_TRUE(Validate(d2,1));
        cout << endl;
    
        int d3[] = {2,4,5,66,7,52,2,3,5,7,10,111,2,4,5,68,3,4,53};
        RxSort(d3, 19, 3, 10);
        for_each(d3, d3+19, ShowElem<int>);
        ASSERT_TRUE(Validate(d3,19));
        cout << endl;
    }

    运行结果:

     image

    参考引用:

    算法精解-C语言描述

  • 相关阅读:
    Servlet的几种跳转(转)
    Java String.split()用法小结(转)
    表单数据提交的方法
    gedit文本编辑器乱码解决办法
    J-Link烧写bootloader到mini2440的Nor Flash
    虚拟机安装Fedora10系统遇到异常
    linux系统忘记root密码怎么办?
    编译busybox时出错及解决方案
    source insight代码查看器如何自定义添加文件类型
    < Objective-C >文件操作-NSFileHandle
  • 原文地址:https://www.cnblogs.com/Quincy/p/5064214.html
Copyright © 2011-2022 走看看