基数排序如何工作?

2024-04-05

我不知道为什么这对我来说如此难以理解。我浏览了 wiki 页面和伪代码(以及实际代码),试图了解基数排序算法的工作原理(相对于存储桶)。

我在这里寻找错误的东西吗?我应该研究桶排序吗?有人能给我一个简化版本的工作原理吗?作为参考,这里是一个代码块据推测执行基数排序:

// Sort 'size' number of integers starting at 'input' according to the 'digit'th digit
// For the parameter 'digit', 0 denotes the least significant digit and increases as significance does
void radixSort(int* input, int size, int digit)
{
    if (size == 0)
        return;

    int[10] buckets;    // assuming decimal numbers

    // Sort the array in place while keeping track of bucket starting indices.
    // If bucket[i] is meant to be empty (no numbers with i at the specified digit),
    // then let bucket[i+1] = bucket[i]

    for (int i = 0; i < 10; ++i)
    {
        radixSort(input + buckets[i], buckets[i+1] - buckets[i], digit+1);
    }
}

我也研究过非递归解决方案:

void radixsort(int *a, int arraySize)
{
    int i, bucket[sortsize], maxVal = 0, digitPosition =1 ;
    for(i = 0; i < arraySize; i++) {
        if(a[i] > maxVal) maxVal = a[i];
    }

    int pass = 1; 
    while(maxVal/digitPosition > 0) {
        // reset counter 
        int digitCount[10] = {0};

        // count pos-th digits (keys) 
        for(i = 0; i < arraySize; i++)
            digitCount[a[i]/digitPosition%10]++;

        // accumulated count 
        for(i = 1; i < 10; i++)
            digitCount[i] += digitCount[i-1];

        // To keep the order, start from back side
        for(i = arraySize - 1; i >= 0; i--)
            bucket[--digitCount[a[i]/digitPosition%10]] = a[i];

        for(i = 0; i < arraySize; i++)
            a[i] = bucket[i];

        cout << "pass #" << pass++ << ": ";
        digitPosition *= 10;
    } 

}

具体来说,这条线给我带来了麻烦。我尝试用笔和纸浏览它,但我仍然不明白这是在做什么:

   // To keep the order, start from back side
        for(i = arraySize - 1; i >= 0; i--)
            bucket[--digitCount[a[i]/digitPosition%10]] = a[i];

在数学中,radix 表示基数,其中小数是以 10 为基数。想象一下,您有一些数字,其中一些数字有多个数字,例如

5, 213, 55, 21, 2334, 31, 20, 430

为简单起见,假设您想使用小数基数 (=10) 进行排序。然后你首先将数字按单位分开,然后再次将它们组合在一起;接下来,您将数字按十分开,然后再次将它们放在一起;然后按数百个依此类推,直到所有数字都排序完毕。每次循环时,只需从左到右阅读列表即可。您还可以想象您将数字分成不同的桶。这是一个使用说明5, 213, 55, 21, 2334, 31, 20, 430

按单位划分:

  • 零:20、430

  • 个数:21、31

  • twos:

  • 三分球:213

  • 四人:2334

  • 五:5、55

    重新组合起来:20、430、21、31、213、2334、5、55

要将它们重新组合在一起,请首先阅读zeroes桶,然后ones桶,然后依此类推,直到您阅读nines bucket.

以十位分隔:

  • 零:05

  • 个数:213

  • 两人:20、21

  • 三位数:430、31、2334、

  • fours:

  • 五:55

    重新组合:5、213、20、21、430、31、2334、55

相隔数百:

  • 零:005、020、021、031、055

  • ones:

  • 两人:213

  • 三分球:2334

  • 四人:430

  • fives:

    重新组合起来:5、20、21、31、55、213、2334、430

相隔数千:

  • 零:0005、0020、0021、0031、0055、0213、0430

  • ones:

  • 两人:2334

  • threes:

  • fours:

  • fives:

    重新组合在一起:5、20、21、31、55、213、430、2334

现在你已经完成了。我在 Geekviewpoint 上看到了一个很好的代码Java http://www.geekviewpoint.com/java/sorting/radixsort and in python http://www.geekviewpoint.com/python/sorting/radixsort

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基数排序如何工作? 的相关文章

  • 对数据框的行进行排序

    我有以下数据框 adjusted RFC df Node Feature Indicator Scaled Class Direction True False 0 0 km lt 0 181 class 4 0 gt 1 NA 125 1
  • 如何在 PHP 中对数组和数据进行排序?

    这个问题旨在作为有关 PHP 中数组排序问题的参考 人们很容易认为您的特定案例是独特的并且值得提出新问题 但大多数实际上只是此页面上的解决方案之一的微小变化 如果您的问题因与此问题重复而被关闭 请仅在您能解释为什么它与以下所有问题显着不同的
  • C中的链表按升序排序

    我正在为我的 C 编程课程编写一个程序 该程序应该为我们提供使用链表的经验 作业的最后部分之一要求我们获取一个链接列表 并使用我们之前在程序中编写的前置或附加函数按升序对其进行排序 struct lnode int datum struct
  • 按百分比减少多边形面积

    我有一个由点 x y 组成的多边形 我想做的是将其减少一个百分比 请记住 我不想只是扩大规模 多边形应该有一种内部边界 其宽度取决于百分比 该内部边界被多边形切断 谁知道可以实现这一目标的算法 输入 点数组 百分比 输出 点数组 你所寻求的
  • 用 Java 创建迷宫求解算法

    我被分配了用 Java 创建迷宫求解器的任务 这是任务 Write an application that finds a path through a maze The maze should be read from a file A
  • C 中的菱形数组排序

    我有以下 C 语言作业 我基本上需要一种方法而不是解决方案 我们有一个 13 x 13 的数组 在数组中 我们有一个需要考虑的菱形形状 该菱形之外的所有内容都初始化为 1 不重要 下面的 5 x 5 数组示例 x x 1 x x x 2 2
  • 缩短文本并仅保留重要句子

    德国网站 nandoo net 提供了缩短新闻文章的可能性 如果使用滑块更改百分比值 文本会发生变化并且某些句子会被遗漏 您可以在这里看到它的实际效果 http www nandoo net read article 299925 http
  • 如何使用 CUDA/Thrust 对两个数组/向量根据其中一个数组中的值进行排序

    这是一个关于编程的概念问题 总而言之 我有两个数组 向量 我需要对一个数组 向量进行排序 并将更改传播到另一个数组 向量中 这样 如果我对 arrayOne 进行排序 则对于排序中的每个交换 arrayTwo 也会发生同样的情况 现在 我知
  • 使用C标准数学库精确计算标准正态分布的CDF

    标准 C 数学库不提供计算标准正态分布 CDF 的函数 normcdf 然而 它确实提供了密切相关的函数 误差函数 erf 和互补误差函数 erfc 计算 CDF 的最快方法通常是通过误差函数 使用预定义常量 M SQRT1 2 来表示 d
  • 如何高效地在屏幕上精确绘制N个点?

    这听起来是一个简单的问题 但我发现要获得良好的性能是非常棘手的 我提出的第一个算法是随机绘制点 从一组中检查是否已绘制 否则绘制 如果我们只绘制几个点 那么这种方法效果很好 但当我们接近填满屏幕时 速度会灾难性地减慢 我想出的最好的方法是构
  • 对 Python 中的嵌套字典进行排序

    我有以下字典 var a Black grams 1906 price 2 05 Blue grams 9526 price 22 88 Gold grams 194 price 8 24 Magenta grams 6035 price
  • 使用主方法求解 T(n) = 2T(n/2) + n/log n 和 T(n) = 4T(n/2) + n/log n 之间的差异

    我最近偶然发现了一个资源 其中 2T n 2 n log ntypeMM 宣布复发无法解决 我接受它作为一个引理 直到今天 另一种资源被证明是矛盾的 在某种意义上 根据资源 下面的链接 其中的 Q7 和 Q18 是建议 分别在问题中的1和2
  • 寻找距离原点最近的 100 颗恒星的算法

    首先让我提出正确的问题 问 有一个文件包含超过一百万个点 x y 每个点代表一颗星星 a b 处有一颗行星地球 现在 任务是构建一种算法 返回距离地球最近的 100 颗恒星 您的算法的时间和空间复杂度是多少 这个问题在各种采访中被问过很多次
  • 我需要一个支持高效随机访问和 O(k) 插入和删除的容器

    我再次尝试问同样的问题question https stackoverflow com questions 3808708 delete parts of a dynamic array and grow other 但我最终提出了一个不同
  • 如何确定算法函数的复杂度?

    您如何知道算法函数对于特定操作是否需要线性 常数 对数时间 它取决于CPU周期吗 您可以通过三种方式 至少 做到这一点 在网上查找算法 看看它是如何描述其时间复杂度的 根据输入大小 自己检查算法 查看嵌套循环和递归条件等内容 以及每个循环运
  • Java中如何对对象数组进行排序?

    我的数组不包含任何字符串 但它包含对象引用 每个对象引用都通过 toString 方法返回名称 id 作者和发布者 public String toString return name n id n author n publisher n
  • 最慢的计算复杂度(Big-O)

    在这些算法中 我知道 Alg1 是最快的 因为它是 n 平方的 接下来是 Alg4 因为它是 n 的立方 然后 Alg2 可能是最慢的 因为它是 2 n 这应该具有非常差的性能 然而Alg3和Alg5在我的阅读速度方面还没有遇到过 这两种算
  • 如何求小于给定数的最大2次方

    我需要找到小于给定数字的最大 2 次幂 我陷入困境 找不到任何解决方案 Code public class MathPow public int largestPowerOf2 int n int res 2 while res lt n
  • 由周期表元素形成的最大单词的算法

    我想为以下问题场景编写一个算法 根据元素周期表元素的名称 找到可以组成的最大单词 符号如Na Ne等应被视为单个元素 这是在一家知名公司的求职面试中被问到的 有人可以帮我解决这个问题吗 我认为更好的方法是检查字典中的每个单词 看看是否可以从
  • 从三点求圆心的算法是什么?

    我在圆的圆周上有三个点 pt A A x A y pt B B x B y pt C C x C y 如何计算圆心 在Processing Java 中实现它 我找到了答案并实施了一个可行的解决方案 pt circleCenter pt A

随机推荐

  • Highcharts 有“趋势线”功能吗?

    基本上 我试图让 Highcharts 自动绘制从第一个数据点到最后一个数据点的直线 以便我可以更轻松地看到 总体趋势 我相信这被称为 趋势线 或其他东西 但我在文档中没有找到与之相关的任何内容 不过 它很可能仍然具有此功能 可以 据我所知
  • iPhone - 保存 URL,无需 setURL:forKey: 和 NSURL

    无论如何 是否可以使用 NSUserDefaults 保存没有 setURL forKey 的 URL 这仅适用于 iOS 4 0 及更高版本 我使用 fileURLWithPath 在本地加载 HTML 文件 它从介绍页面开始 用户可以点
  • 如何从 onPress on Alert 函数调用方法 [React-Native]

    如何从 onPress on Alert 函数调用方法 React Native
  • java中特定货币的货币符号的位置

    我知道如何使用 locale 和 NumberFormat 类获取 java 中货币的货币对象和其他详细信息 但我无法在 API 中找到任何内容来了解 货币符号是在开始还是结束时显示 例如 在美国 10 表示 10 美元 其中 位于数字开头
  • 如何在 Trigger.io 上禁用“ipad 兼容性”?

    我需要我的应用程序只能在 iPhone 上运行 而不能在 iPAD 上运行 这个要怎么设置呢 我们在平台 v1 4 16 中提供了对此的支持 http docs trigger io en v1 4 release notes html v
  • 我可以检测 Android 设备上是否存在“LED 通知”吗?

    背景 我有一个带有通知的应用程序 我想支持 LED 通知 并且它运行良好 在我的偏好中 我允许用户自定义 LED 通知 问题 如果设备不支持 LED 自定义选项 我不想显示这些选项 因为这可能会让用户感到困惑 如果您拥有的只是廉价的 And
  • 为嵌套的 ScriptableObjects 构建编辑器以在纸牌游戏中组合能力

    我正在构建一款纸牌游戏 我希望有一个干净的纸牌能力架构 我有一个带有卡片属性的 CardData ScriptableObject 我希望卡牌能力组合在一起来描述卡牌的作用 比如一张名为绘制和治疗卡抽 2 张牌并在玩时恢复 5 点生命值 我
  • 类型稳定性如何让 Julia 如此之快?

    我听说类型稳定性使 Julia 如此之快 同时仍然与其他解释语言 例如 Python 一样具有表达能力 类型稳定性允许编译器在编译时直接根据输入类型确定函数的输出类型 因为 Julia 专门针对每种输入类型进行编译 这意味着如果所有函数都是
  • HtmlUnit无法获取IFRAME添加的js/ajax

    我刚刚开始学习htmlunit http htmlunit sourceforge net by gargoylesoftware 我有一个问题 页面上有一个 iframe 单击按钮后会出现该 iframe 当我尝试按名称获取此 ifram
  • 使用 MockMVC 测试 Spring MVC 请求参数映射和 MultipartFile

    我正在尝试使用 Spring MVC 3 2 创建一个 RESTful 控制器端点来上传文件以及该文件的元数据映射 定义如下 Controller RequestMapping file public class FileServiceCo
  • 如何在scala中使用相对路径读取文本文件

    我有一个用 scala 编写的简单 mvn 项目 我想访问一个文本文件并读取其内容 该代码工作正常 但唯一的问题是我在读取文本文件时给出了绝对路径 以下是我的项目的目录结构 如何使用相对路径来读取该文件 我是否必须将 movie txt 文
  • Service 或 IntentService 或 AlarmManager 方法

    我正在构建一个类似游戏的应用程序 并且我一直在阅读有关在后台 前台 警报等中使用服务运行事物的所有不同方法 我有点困惑 我的应用程序会像这样 示例 用户按下 Main 中的按钮 然后他可以关闭应用程序 30 分钟后 Activity1 打开
  • Azure JWT 具有属性“hasgroups=true”而不是组属性对象

    我有一个带有 Azure Active Directory 身份验证的 Azure Web 应用程序 使用 adal Angular 制作 在我设置的应用程序清单中 groupMembershipClaims SecurityGroup 奇
  • Neo4j:传统索引和自动索引与新标签库模式索引

    我目前正在寻找索引数据的最佳方法 从我的角度来看 有以下三个选项 1 遗留索引 索引管理器 API 2 自动索引 neo4j properties node auto indexing true ode keys indexable nam
  • 如何使用 Head 和 Tail 打印文件的特定行

    我想说输出文件的第 5 10 行 作为传入的参数 我怎样才能使用head and tail去做这个 where firstline 2 and lastline 3 and filename 1 运行它应该如下所示 lines sh fil
  • RNetlogo 和 NetLogo 5.3 错误

    我一直在 NetLogo 5 2 1 中使用 RNetLogo 没有出现任何问题 现在我使用 NetLogo 5 3 并收到此错误 gt library RNetLogo gt nl path lt Applications NetLogo
  • 行计数 C++

    我正在处理程序中的逻辑行数 省略注释和黑线 计数线正在工作 但我不知道如何省略注释行 我尝试 if line comment 但它只检查以以下开头的行 如果旁边有文本 则不会将其视为注释行 最后当我知道总行数和总注释行数时 我会减去tota
  • FBSDKLoginManager logInWithPublishPermissions 始终返回 isCancelled=YES

    我无法弄清楚如何让用户登录我的应用程序 FBSDKAccessToken currentAccessToken 为零 所以我打电话 FBSDKLoginManager alloc init logInWithPublishPermissio
  • 任何自动更新页面所有帖子时间的 jquery 插件

    我有一个页面 其中有很多帖子 显示它们发布的时间 我想每 1 分钟后继续更新该时间 一种简单的方法可以给它们一个相同的类 并在 1 分钟后获取所有元素并更新时间 有什么更好的解决方案 您可以使用像这样的简单插件 fn UpdateSince
  • 基数排序如何工作?

    我不知道为什么这对我来说如此难以理解 我浏览了 wiki 页面和伪代码 以及实际代码 试图了解基数排序算法的工作原理 相对于存储桶 我在这里寻找错误的东西吗 我应该研究桶排序吗 有人能给我一个简化版本的工作原理吗 作为参考 这里是一个代码块