基数排序(计数法)

/**
 * author:      bbird_gl
 * date:        2019/7/11
 * description: 基排序(计数法实现)
 */
#include <stdlib.h>
#include <string.h>

//n为数组大小,d为排序码数, r为基数
void RadixSort(int arr[], int n, int d, int r)
{
    int *tempArr = (int *)malloc(n * sizeof(int));  //临时数组
    int *count = (int *)malloc(r * sizeof(int));    //计数数组
    int i, j, k;
    int radix = 1;  //用于取arr[j]的第i位排序码
    
    for (i = 0; i < d; i++) {
        memset(count, 0, r * sizeof(int));  //数组清零

        for (j = 0; j < n; j++) {
            k = (arr[j] / radix) % r;
            count[k]++;
        }

        //用于求数组元素在tempArr中的位置
        for (j = 1; j < r; j++)
            count[j] = count[j - 1] + count[j];

        for (j = n - 1; j >= 0; j--) {
            k = (arr[j] / radix) % r;
            count[k]--;
            tempArr[count[k]] = arr[j];
        }

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

        //用于取下一位排序码
        radix *= r;
    }

    free(tempArr);
    free(count);
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值