Radix Sort

本文介绍了一种基数排序算法的实现,该算法适用于整数排序,并能够高效处理正负数。通过分配收集的方式,在多次迭代中按位对数值进行排序,最终得到有序数组。

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

/*
 * Radix sort

 * We can use a bitset to represent positive or negative number to accelarate the algorithm
 */
#include <iostream>
#include <vector>
#include <assert.h>
using namespace std;

typedef vector <int> Vector;

static int digits(Vector &);
static void scatter(Vector &,vector<Vector> &,int );
static void gather(Vector &,vector <Vector> &);
static void clearBucket(vector <Vector>&);
static void radix(Vector & );

int main(void)
{
    vector <int> array;
    array.push_back(12);
    array.push_back(124);
    array.push_back(24);
    array.push_back(5);
    array.push_back(343);
    array.push_back(35);
    array.push_back(134);
    array.push_back(INT_MAX);
    array.push_back(-23);

    for(size_t i=0;i<array.size();i++)
        cout<<array[i]<<" ";
    cout<<endl;

    radix(array);

    for(size_t i=0;i<array.size();i++)
        cout<<array[i]<<" ";
    cout<<endl;

    return 0;
}

/*
 * Get the largest digits
 */
static int digits(Vector & a)
{
    assert(a.size()>0);

    int d=0,largest=a[0];

    for(size_t i=1;i<a.size();i++)
        if(a[i]>=0 && a[i]>largest)
            largest=a[i];
        else if(a[i]<0 && (-a[i])>largest)
            largest=-a[i];

    while(largest){
        ++d;
        largest/=10;
    }

    return d;
}

/*
 * Scatter numbers in buckets
 */
static void scatter(Vector &a,vector<Vector> & bucket,int digit)
{
    int id,div=1;

    for(int i=0;i<digit;i++)
        div*=10;

    for(size_t j=0;j<a.size();j++){
        if(a[j]>=0){
            id=(a[j]%div-a[j]%(div/10)) / (div/10)+10;
            bucket[id].push_back(a[j]);
        }
        else{
            a[j]=-a[j];
            id=(a[j]%div-a[j]%(div/10)) / (div/10);
            a[j]=-a[j];
            bucket[id].push_back(a[j]);
        }
    }
}

/*
 * Gather numbers from buckets
 */
static void gather(Vector &a,vector<Vector>&bucket)
{
    int i,j,index,temp;

    for(i=0,index=-1;i<10;i++)
        for(j=0;j<bucket[i].size();j++)
            a[++index]=bucket[i][j];

    for(i=0,j=index;i<j;i++,j--){
        temp=a[i];
        a[i]=a[j];
        a[j]=temp;
    }
    for(i=10;i<20;i++)
        for(j=0;j<bucket[i].size();j++)
            a[++index]=bucket[i][j];
}

/*
 * Clear bucket
 */
static void clearBucket(vector <Vector> &bucket)
{
    for(int i=0;i<20;i++)
        bucket[i].clear();
}

/*
 * Radix Sort
 */
static void radix(Vector & a)
{
    int d=digits(a);
    Vector temp;
    vector <Vector>bucket(20,temp);
   
    for(int i=1;i<=d;i++){
        scatter(a,bucket,i);
        gather(a,bucket);

        if(i!=d)
            clearBucket(bucket);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值