吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1048|回复: 4
收起左侧

[已解决] C 基数排序(实现来自维基)

[复制链接]
ing 发表于 2020-3-30 00:00
本帖最后由 ing 于 2020-3-31 17:05 编辑

我不理解这2个for循环,我只知道功能但不懂它的实现思想
捕获.PNG



#include<stdio.h>
#define MAX 20
#define SHOWPASS
#define BASE 10

void print(int *a, int n) {
        int i;
        for (i = 0; i < n; i++) {
                printf("%d\t", a[i]);
        }
}

void radixsort(int *a, int n) {
        int i, b[MAX], m = a[0], exp = 1;

        //找出最大值
        for (i = 1; i < n; i++) {
                if (a[i] > m) {
                        //令 m 为最大值
                        m = a[i];
                }
        }

        // 最大值 m ÷ exp 得到运行次数,exp:1 每次乘10
        // m:99,99/1>0,99/10>0,99/100=0
        while (m / exp > 0) {
                int bucket[BASE] = { 0 };

                //执行while第一次,for 执行结束后,将标出所有相同个位的总数在buctet中
                //a{50,123,543,187,49,30,0,2,11,100};        bucket{4,1,1,2,0,0,0,1,0,1}  
                for (i = 0; i < n; i++) {
                        bucket[(a[i] / exp) % BASE]++;
                }

                //目的???
                //bucket{4,5,6,8,8,8,8,9,9,10}  
                for (i = 1; i < BASE; i++) {
                        bucket[i] += bucket[i - 1];
                }

                //目的???
                //bucket{0,4,5,6,8,8,8,8,9,9}  
                //执行while第一次,按个位进行分配 b{50,30,0,100,11,2,123,543,187,49}
                for (i = n - 1; i >= 0; i--) {
                        b[--bucket[(a[i] / exp) % BASE]] = a[i];
                }

                //保存每次基数排序的结果
                for (i = 0; i < n; i++) {
                        a[i] = b[i];
                }

                exp *= BASE;

#ifdef SHOWPASS
                printf("\nPASS   : ");
                print(a, n);
#endif
        }
}

int main() {
        int arr[MAX];
        int i, n;

        printf("Enter total elements (n <= %d) : ", MAX);
        scanf_s("%d", &n);
        n = n < MAX ? n : MAX;

        printf("Enter %d Elements : ", n);
        for (i = 0; i < n; i++) {
                scanf_s("%d", &arr[i]);
        }

        printf("\nARRAY  : ");
        print(&arr[0], n);

        radixsort(&arr[0], n);

        return 0;
}


调试数据
50
123
543
187
49
30
0
2
11
100

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

JuncoJet 发表于 2020-3-30 00:18
不懂算法,不过百度了下,看上去像二叉树
如果只是要实现排序,直接用 std::set 偷懒
如果要实现算法,我就帮不了你了,没空造轮子
头像被屏蔽
KamiMao 发表于 2020-3-30 01:47
dandaodaodan 发表于 2020-3-30 02:21
无名氏wyw 发表于 2020-3-30 07:59
基数排序简单点来说就是把数字的每一位进行一次桶排序

效率奇低,建议看看就好,真要用还是快排爽
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-4-19 15:18

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表