基数排序(RadixSortC语言)


#include <stdio.h>

#include <time.h>

#include <stdlib.h>

int getMax(int arr[], int n);

void countSort(int arr[], int n, int exp);

void countSort(int arr[], int n, int exp);

void radix_sort(int arr[], int n);

void print(int arr[], int n);

int * buildarray(void);

#define ARRAYSIZE 2000000



int main()

{

    int * arr=buildarray();

    print(arr,ARRAYSIZE);

    float time_start=clock();

    radix_sort(arr, ARRAYSIZE);

    float time_end=clock();

    print(arr, ARRAYSIZE);

    printf("Consume :%.2fs",(time_end-time_start)/CLOCKS_PER_SEC);

    free(arr);

}




// 获取 arr[]中的最大数

int getMax(int arr[], int n)

{

    int mx = arr[0];

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

        if (arr[i] > mx)

            mx = arr[i];

    return mx;

}


// 据exp所代表的位

// 使用低位计数排序

void countSort(int arr[], int n, int exp)

{

    int output[n]; // 输出数组

    int i;

    int count[10] = {0};

    // 将相应位的数字记录在count[]数组中

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

        count[ (arr[i]/exp)%10 ]++;

    // count[i]实际上表示

    //  各个数在output[]所在的位置

    for (i = 1; i < 10; i++)

        count[i] += count[i - 1];

    // 建立输出数组

    for (i = n - 1; i >= 0; i--)

    {

        output[count[ (arr[i]/exp)%10 ]-1 ] = arr[i];

        count[ (arr[i]/exp)%10 ]--;

    }


    // 复制output到arr[]中, 因此 arr[] 中

 // 实际上按目前位排序后的结果

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

        arr[i] = output[i];

}


// main() 函数里面用到的radix_sort()函数

void radix_sort(int arr[], int n)

{

    //找到最大数,以此来确定有多少位

    int m = getMax(arr, n);


    // 此处有一定技巧,也是最出彩的地方(个人看法),不是依靠人传递位,而是通过

    // 下面这个式子,来确定各个位上的值

    for (int exp = 1; m/exp > 0; exp *= 10)

        countSort(arr, n, exp);

}


// 打印数组

void print(int arr[], int n)

{

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

    {    printf("%5d",arr[i]);

                if((i+1)%10==0)

                        putchar('\n');

    }

   putchar('\n');

}


//建立数组

int * buildarray(void)

{       int * arr=(int *)malloc(ARRAYSIZE*sizeof(int));

        srand(time(0));

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

                arr[i]=rand()%ARRAYSIZE;

        return arr;

}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值