基数排序(Radix Sort)

10.基数排序(Radix Sort)

基数排序也是非比较的排序算法,对每一位进行排序,从最低位开始排序,复杂度为O(kn),为数组长度,k为数组中的数的最大的位数;

(1)算法简介

基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。基数排序基于分别排序,分别收集,所以是稳定的。

(2)算法描述和实现;具体算法描述如下:

<1>.取得数组中的最大数,并取得位数;

<2>.arr为原始数组,从最低位开始取每个位组成radix数组;

<3>.对radix进行计数排序(利用计数排序适用于小范围数的特点);

(3)算法分析:最佳情况:T(n) = O(n * k);最差情况:T(n) = O(n * k);平均情况:T(n) = O(n * k)

#include <iostream>

using namespace std;

void printArray(int array[],int length)

{ for (int i = 0; i < length; ++i)

{  cout << array[i] << " "; }

cout << endl;  }

/**求数据的最大位数,决定排序次数*/

int maxbit(int data[], int n)

{   int d = 1; //保存最大的位数

    int p = 10;

    for(int i = 0; i < n; ++i)

    {   while(data[i] >= p)  {   p *= 10;  ++d;   }   }

    return d;

}

void radixsort(int data[], int n) //基数排序

{  int d = maxbit(data, n);

    int tmp[n];

    int count[10]; //计数器

    int i, j, k;

    int radix = 1;

    for(i = 1; i <= d; i++) //进行d次排序

    {   for(j = 0; j < 10; j++)   count[j] = 0; //每次分配前清空计数器

        for(j = 0; j < n; j++)//统计每个桶中的记录数

           {   k = (data[j] / radix) % 10;   count[k]++;    }

        for(j = 1; j < 10; j++) count[j] = count[j - 1] + count[j]; //将tmp中的位置依次分配给每个桶

        for(j = n - 1; j >= 0; j--) //将所有桶中记录依次收集到tmp中

           {   k = (data[j] / radix) % 10; tmp[count[k] - 1] = data[j];  count[k]--;    }

        for(j = 0; j < n; j++)  data[j] = tmp[j];  //将临时数组的内容复制到data中

        radix = radix * 10;

    }

}

int main()

{ int array[10] = {73,22,93,43,55,14,28,65,39,81};

radixsort(array,10);

printArray(array,10);

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值