递减计数排序算法中的元素计数
Decrementing counts of elements in counting sort algorithm
我从伪代码中实现了计数排序算法。在伪代码中,最后一个循环在第一次传递后C[A[j]]
递减。这会将所有内容向右移动,因此我在第一次通过之前进行了调试和递减以产生正确的结果。但是除了它有效之外,我看不出原因,为什么我必须在之前而不是之后减少。
这是我在之后递减时的结果:
10 1 0 6 8 3 2 0 9 4
0 0 0 1 2 3 4 6 8 9
当我之前递减时:
10 1 0 6 8 3 2 0 9 4
0 0 1 2 3 4 6 8 9 10
显然,由于最初所有内容都向右移动,因此我将所有内容都向左移动,但是为什么首先它不会正确对齐呢?
int* counting_sort(int A[], int size, int k)
{
int* B = new int[size];
int* C = new int[k+1];
for(int i = 0; i <= k; i++)
C[i] = 0;
for(int j = 0; j < size; j++) {
C[A[j]]++;
}
for(int i = 1; i <= k; i++) {
C[i] += C[i-1];
}
//print(C,k+1);
for(int j = size-1; j >= 0; j--) {
B[--C[A[j]]] = A[j];
}
delete [] C;
return B;
}
for(int j = size-1; j >= 0; j--) {
B[--C[A[j]]] = A[j];
}
相当于:
for(int j = size-1; j >= 0; j--) {
int element = A[j];
int pos = C[element] - 1;
B[pos] = element;
C[element]--;
}
想象一下数组1 0 1
.现在元素计数如下:
0
- 1次
1
- 2 次
仓位增量的准备按其前面的元素数量计算:
0
- 1
1
- 3
元素在新(排序)数组中的位置现在为(计数 - 1):0
的位置 = 1 - 1 = 0
第一1
的位置 = 3 - 1 = 2
第二1
的位置 = 2 - 1 = 1
让它0 1 1
.
相关文章:
- 查找两个排序向量中共有的元素
- C++ 如何比较n个排序的整数向量以找到互元素?
- 如何在 c++ 中根据第二个元素按降序对列表进行排序
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- 高级选择排序 - 在一次迭代中搜索两个元素
- 为什么用户定义的函数不按照给定的顺序对相同长度的元素进行排序?
- 为什么这个选择排序算法仍然切换一个元素,当它已经是其他元素中最小的元素时?
- 快速排序 - 三个中位数枢轴选择 - 某些元素顺序不正确
- 将一系列已排序的元素划分为相邻组
- 如何通过保持第一个插入的位置来对列表中插入的其余元素进行排序?
- 保持排序的数据结构,允许log N插入时间,并且可以返回我在log N中查找的元素的索引
- "x"的所有元素都存在于"y"(排序向量)中吗?
- 如何根据对的第二个元素对 STL c++ 中的一组对进行排序?
- 如何在保持它们连接到同一元素的同时对 2 个数组进行排序?
- 使用 pair 创建priority_queue,以便在第一个元素相等时"<"第一个元素的排序,对第二个元素">"排序
- 如何将元素排序到矩阵C++
- 如何保持按第二个元素排序的对的优先级队列?
- 如何从两个数组中生成一对向量,然后使用CUDA/Thrust按对的第一个元素排序
- 部分排序数组,最后n个元素排序
- 如何对一对向量按降序排序,并按第二个元素排序