【问题标题】:Sorting using radix sort使用基数排序进行排序
【发布时间】:2017-09-01 09:23:11
【问题描述】:

我正在从this site 阅读radix sort 我在第三个for loop 中感到困惑:

for (i = n - 1; i >= 0; i--) {
    output[freq[(arr[i] / place) % range] - 1] = arr[i];
    freq[(arr[i] / place) % range]--;
}

为什么他们从头开始,因为当我试图从 0 开始时,它给了我错误的答案?任何解释或解决方案将不胜感激。

【问题讨论】:

    标签: java radix-sort


    【解决方案1】:

    因为freq 包含范围内每个位置的元素的累积数量。也就是说,对于 i=0-9 的范围,freq[i] 包含放置在位置 0, ..., i 上的位数。

    该算法使用freq 来跟踪它需要从初始数组绘制到每个位置的输出数组的项目数。

    假设 10,21,17,34,44,11,654,123 作为输入,对第一个无意义的数字运行计数排序:

    0: 10
    1: 21 11
    2:
    3: 123
    4: 34 44 654
    5:
    6:
    7: 17
    8:
    9: 
    

    freq 将是:

    0: 1
    1: 3
    2: 3
    3: 4
    4: 7
    5: 7
    6: 7
    7: 8
    8: 8
    9: 8
    

    所以,数组变成了 10,21,11,123,34,44,654,17。

    您需要向后循环以保持具有相同数字的数字的原始顺序,因为freq 是如何构建的。假设您要将 34 放置在输出的正确位置。根据freq 数组,如果向前循环,则将其放置在不正确的第 7 位。如果向后循环,则在到达 34 之前,您已经放置了 654 和 44,所以 freq[4]=5 到那时是正确的位置。

    【讨论】:

    • 如果我想运行从索引 1 到数组大小的循环怎么办?
    • 这就是我所说的“循环前进”。您不能通过向前循环来保留存储桶的“原始顺序”。你只能通过“向后”循环来做到这一点。
    猜你喜欢
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 2012-04-08
    相关资源
    最近更新 更多