gpt4 book ai didi

algorithm - 基数排序如何工作?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:13:48 24 4
gpt4 key购买 nike

我不知道为什么这对我来说如此难以理解。我查看了 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];

最佳答案

在数学中,基数表示基数,其中小数以 10 为底数。假设您有一些数字,其中一些数字不止一位数,例如

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

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

的插图

按单位分隔:

  • 零:20、430

  • 个:21、31

  • 两个:

  • 三分:213

  • 四:2334

  • 五:5、55

    回到一起:20、430、21、31、213、2334、5、55

要将它们放回一起,首先读取zeroes bucket,然后读取ones bucket,然后依此类推,直到读取nines桶。

以十位分隔:

  • 零:05

  • 个数:213

  • 两个:20、21

  • 三分球:430、31、2334,

  • 四肢:

  • 五:55

    回到一起:5、213、20、21、430、31、2334、55

以百位分隔:

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

  • 一个:

  • 二:213

  • 三分球:2334

  • 四人组:430

  • 五:

    回到一起:5、20、21、31、55、213、2334、430

以千位分隔:

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

  • 一个:

  • 二:2334

  • 三元组:

  • 四肢:

  • 五:

    回到一起:5、20、21、31、55、213、430、2334

你现在已经完成了。我在 Java 中的 Geekviewpoint 上看到了一个很好的代码在python

关于algorithm - 基数排序如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14717560/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com