排序算法——基数排序

10 篇文章 0 订阅

1.基数是什么?

基数排序(radix sort)属于“分配式排序”(distribution sort),顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。

2.描述

基数排序算法的原理如下:

  1. 遍历序列,取出权重因子的最大长度(若为字符串,则radix=字符串最大长度)。
  2. 按照权重因子的优先级进行排序。
  3. 将步骤2中排序的数组放入原数组。
  4. 权重因子+1,重复步骤2-3,直到权重因子使用完毕。

3.示例

/*
 *  基数排序 用于取得整数最大值的位数
 */
int getMaxValueBit(int arrs[], int length) {
  int bit = 0;
  int max = arrs[0];
  for (int i = 1; i < length; i++) {
    if (arrs[i] > max) max = arrs[i];
  }

  while (max) {
    max = max / 10;
    bit++;
  }
  return bit;
}

// 基数排序
void radixSort(int arrs[], int length) {
  int loop = getMaxValueBit(arrs, length);  // 权重因子长度
  int radix = 1;                            // 计算整数权重因子
  int count[10] = {0};                      // 桶
  int *result = new int[length];
  for (int i = 0; i < loop; i++) {
    memset(count, 0, sizeof(count));
    for (int j = 0; j < length; j++)
      count[(arrs[j] / radix) % 10]++;  // 统计个/十/百/……位相同的数据

	// --count[(arrs[j] / radix) % 10]存储arrs[j]在顺序列表中的位置
    for (int j = 1; j < 10; j++) count[j] += count[j - 1];

    // 将个(十,百,……)位相同的数据从小到大排序
    for (int j = length - 1; j >= 0; j--)
      result[--count[(arrs[j] / radix) % 10]] = arrs[j];

    memcpy(arrs, result, sizeof(int) * length);

    radix = radix * 10;
  }
  if (result != NULL) delete[] result;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值