计数排序中的循环说明

时间:2013-04-08 19:56:05

标签: c++ algorithm sorting loops

有人可以向我解释一下这个计数排序实现中第二个循环的目的吗?:

short c[RADIX_MAX] = {0};
int i;

for (i = 0; i < LEN_MAX; i++) {
    if (i == len)
        break;
    int ind = a.getElem(i); 
    c[ind]++;
}

for (i = 1; i < RADIX_MAX; i++) {
    if (i == radix)
        break;
    c[i] += c[i - 1];
}

for (i = LEN_MAX - 1; i >= 0; i--) {
    int j = i - LEN_MAX + len;      
    if (j < 0)
        break;
    int ind = a.getElem(j);
    short t = ind;
    ind = --c[ind];
    b.setElem(ind, t);
}

2 个答案:

答案 0 :(得分:1)

通过从元素本身的值计算要排序的每个元素的目标索引来计算排序。涉及三个通道:

  • 在第一个循环中,每个元素都被计算在内:例如,我们的数组有六个“A”和两个“B”,五个“C”等等。

  • 在第二个循环中,计算每个元素所在的索引。如果有六个“A”,那么第一个“B”需要在索引6处(在基于0的索引中)。计数排序的作用有点复杂,以使代码更简单,排序更稳定。在第三个循环中,它将以 reverse 顺序遍历原始数组,因此在第二个循环中,它计算的索引不是给定值的第一个实例,而是最后。在上面的示例中,最后一个“A”需要出现在索引5处,但最后一个“B”需要在索引6(“A”s)+ 2(“B”s) - 1(基于零)=因此,对于每个值,它计算该值的结束索引。它向前移动计数数组,将先前计算的计数添加到当前计数。所以在我们的count数组中,“A”的值保持为6(没有前一个元素),“B”的值是6 + 2 = 8(六个“A”+两个“B”),C的值现在是6 + 2 + 5 = 13(六个“A”+两个“B”+五个“C”),依此类推

  • 在最后一个循环中,将值插入到它们的位置,在我们继续时递减索引。因此,最后一个“B”插入索引7,前一个插入索引6,依此类推。这保留了相等元素的原始顺序,使得稳定排序对于Radix排序是必不可少的。

答案 1 :(得分:1)

对于每个数字,我们计算从排序数组开始的索引。 例如:
array: 0 0 0 0 2 2 3 3 3 9 9
index: 0 1 2 3 4 5 6 7 8 9 10
然后c [0] = 0,c [1] = 4,c [2] = 4,c [3] = 6,c [4] = 9,... c [9] = 9。
出现数字的排序数组中的索引取决于前一个数字的索引和前一个数字的数字。第二个循环计算这个。