排序算法--基数排序(箱排序的改进)

本文深入解析Radix Sort算法的核心原理,包括模板化设计、深度查找、桶排序等关键步骤,详细阐述了如何通过Radix Sort算法高效地对不同数据类型进行排序,并提供了一个具体实现示例,旨在提升数据处理效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <assert.h>
#include <stdlib.h>

template <typename T>
size_t FindDepth(T iData[], size_t iBegin, size_t iEnd)
{
    size_t iMaxDepth = 0;
    size_t iCurDepth = 0;
    char cData[15] = "";

    while (iBegin <= iEnd)
    {
        iCurDepth = sprintf_s(cData, sizeof(cData), "%d", iData[iBegin]);
        iMaxDepth = iMaxDepth>=iCurDepth ? iMaxDepth:iCurDepth;
        iBegin++;
    }

    return iMaxDepth;
}


//compute d^n
static size_t mPow(size_t d, size_t n)
{
    assert(d || n);
    if (!n)
        return 1;
    while (--n)
        d *= d;
    return d;
}


template <typename T>
void RadixSort(T iData[], size_t iBegin, size_t iEnd)
{
    T (*piRadix)[10] = new T[iEnd-iBegin+1][10];
    size_t iBoxDepth[10];

    size_t iDepth = FindDepth(iData, iBegin, iEnd);
    for (size_t i = 0; i < iDepth; i++)//扫描数据位数层
	{
		//桶深度清零
		for (size_t k = 0; k < 10; k++)
			iBoxDepth[k] = 0;

        //分配入桶
        for (size_t j = iBegin; j <= iEnd; j++)//扫描数据个数
        {
            size_t iCurNum = (iData[j]%mPow(10,i+1))/(mPow(10,i));//取当前数据当前位值
            piRadix[iBoxDepth[iCurNum]][iCurNum] = iData[j];//将当前值堆入桶中
            iBoxDepth[iCurNum]++;
        }

        //重新排序
        size_t r = 0;//已重新排列数据个数
        for (size_t s = 0; s < 10; s++)//每一个桶顺序取
        {
            for (size_t t = 0; t < iBoxDepth[s]; t++)//桶尝试
            {
                iData[r] = piRadix[t][s];//从桶中取数据
                r++;
            }
        }
    }

    if (!piRadix)
        delete []piRadix;
    return;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值