[经典算法]基数排序

概述:

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

例子:

用基数排序对十进制数据{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语言描述

posted @ 2015-12-21 18:10  Quincy  阅读(300)  评论(0编辑  收藏  举报