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语言描述

  • 相关阅读:
    符号解析
    编译器与链接器的功能
    hook的本质就是在本原可执行文件中加东西
    Mac-O文件加载的全过程(一)
    系统在执行可执行文件几个过程
    动态库连接器–动态库链接信息(Mach-O文件格式和程序从加载到执行过程)
    load 调用的顺序
    iPhone Mach-O文件格式与代码签名
    Redis正确使用的十个技巧
    redis slowlog
  • 原文地址:https://www.cnblogs.com/Quincy/p/5064214.html
Copyright © 2011-2022 走看看