计数排序中的循环解释
Loop Explanation in Counting Sort
谁能给我解释一下这个计数排序实现中的第二个循环的目的?:
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);
}
计数排序通过从元素本身的值计算要排序的每个元素的目标索引来工作。这里涉及到三次传递:
-
在第一个循环中,对每个元素进行计数:例如,我们的数组有6个"A"、2个"B"、5个"C"等等。
-
在第二个循环中,计算每个元素所在的索引。如果有6个"A",那么第一个"B"需要位于索引6处(在基于0的索引中)。为了使代码更简单和排序更稳定,计数排序所做的事情有点复杂。在第三个循环中,它将以反向顺序遍历原始数组,因此在第二个循环中,它不是计算给定值的第一个实例的索引,而是计算最后一个实例的索引。在上面的例子中,最后一个"A"需要出现在索引5,但是最后一个"B"需要出现在索引6("A")+ 2("B")- 1(从零开始)=索引7。因此,对于每个值,它计算该值的结束索引。它向前遍历计数数组,将先前计算的计数添加到当前计数中。所以在我们的count数组中,A的值仍然是6(没有前一个元素),B的值是6+2=8(6个A +2个B), C的值是6+2+5=13(6个A +2个B +5个C),以此类推
-
在最后一个循环中,值被插入到它们的位置,随着我们的进行,索引递减。所以最后一个B被插入到索引7处,再前面一个被插入到索引6处,以此类推。这保留了相等元素的原始顺序,使得排序稳定,这对于基数排序是必不可少的。
对于每一个数字,我们计算它在排序数组中的起始位置。例子: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。
排序数组中数字出现的索引取决于前一位数字的索引和前一位数字的个数。第二个循环计算这个。
- 如何循环打印顶点结构
- 如何在C++中从两个单独的for循环中添加两个数组
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 正在尝试了解输入验证循环
- 这个 FOR-IF 循环的解释是什么?
- 有人可以为我解释这个奇怪的循环吗?
- 解释这个循环的输出
- C 有人可以解释这些循环在说什么
- C++循环依赖关系解释
- 请解释 for 循环索引的范围
- 有人可以用例子解释递归如何与 while 循环一起工作吗?我无法理解流程
- 从模板类调用函数时形成的无限循环,请任何人解释
- 请解释:在 for 循环之后跳过了行
- 你能解释一下布尔如何控制循环吗?
- 请解释一下这个c++ for循环,而不是for循环.更新2
- 用1个循环解释二维数组迭代
- 有人能解释一下这个while循环中的错误吗?
- 计数排序中的循环解释
- 在循环内为类成员声明线程时,需要解释HEAP和STACK
- 有人能解释一下这个特殊的打印语句在for循环中做了什么吗