计数排序算法 - 以负整数和正整数作为输入(不允许使用 Map)
Posted
技术标签:
【中文标题】计数排序算法 - 以负整数和正整数作为输入(不允许使用 Map)【英文标题】:Counting Sort algorithm - take negative and positive integer as input (using Map is not allowed) 【发布时间】:2021-06-08 17:26:55 【问题描述】:正如您在这段代码中看到的,我刚刚做了如何使用计数排序对正整数进行排序。但我的要求是我必须采取 负数和正数作为输入然后必须对 数组使用计数排序。然后找到数组中的最小值 不允许输入。我不知道这将是什么逻辑和解决方案。
注意:如果我在输入中取负数。该值的输出显示为 0。
输入:9, 8, 6, -7, 2, 1
输出:-7, 1, 2, 6, 8, 9
int k=0;
void Counting_Sort(int A[],int B[],int n)
int C[k+1];
for(int i=0; i<=k; i++)
C[i]=0;
for(int j=1; j<=n; j++)
C[A[j]]++;
for(int i=1; i<=k; i++)
C[i]+=C[i-1];
for(int j=n; j>=1; j--)
B[C[A[j]]]=A[j];
C[A[j]]=C[A[j]]-1;
// 驱动代码
int main()
int n;
cout<<"Enter the size of the array :";
cin>>n;
int A[n],B[n];
for(int i=1; i<=n; i++)
cin>>A[i];
if(A[i]>k)
/*It will modify k if an element
occurs whose value is greater than k*/
k=A[i];
Counting_Sort(A,B,n);
/*It will print the sorted sequence on the
console*/
for(int i=1; i<=n; i++)
cout<<B[i]<<" ";
cout<<endl;
return 0;
【问题讨论】:
什么是 A、B 和 n 作为算法的输入?什么是k?你也有驱动代码,你能解释一下现在出了什么问题吗? 我担心您的参数不会尊重C
是 1 个整数的数组。
请出示minimal reproducible example 并解释代码应该做什么以及它有什么问题
c++ 不支持变长数组,你应该改用std::vector
。为什么k
是全局的而不是函数的参数?
通常的方法是在排序前对数组值添加一个最小数字的偏移量,排序后再次删除
【参考方案1】:
也有一个简单的解决方案。只需将maxValue
(假设这是数字可以拥有的最大绝对值)添加到所有元素,使用计数排序对它们进行排序,然后减去maxValue
以取回原始值。加法使它们都为非负数。
【讨论】:
【参考方案2】:这个问题有一点限制,但这可以通过将负数反转回正数并将负数和正数存储在 2 个不同的数组中来解决。然后你可以先打印负数组,然后打印正数组:
#include <iostream>
#include <cstring>
using namespace std;
const int maxval = 10000; //maximum absolute value of each element, you can change this
int positiveArr[maxval+1], negativeArr[maxval+1]; //positive and negative array
int main()
int n; cin >> n;
memset(positiveArr, 0, sizeof(positiveArr)); //set all value to 0
memset(negativeArr, 0, sizeof(negativeArr)); //set all value to 0
for (int i = 1; i <= n; i++)
int x; cin >> x; //input number;
if (x >= 0) //if x is non-negative
positiveArr[x]++; //add count of x
else
negativeArr[-x]++; //add count of -x
for (int i = maxval; i >= 1; i--) //printing the negative array
if (negativeArr[i] > 0)
for (int j = 1; j <= negativeArr[i]; j++) cout << -i << " ";
for (int i = 0; i <= maxval; i++) //printing the positive array
if (positiveArr[i] > 0)
for (int j = 1; j <= positiveArr[i]; j++) cout << i << " ";
return 0;
结果:
6
9 8 6 -7 2 1
-7 1 2 6 8 9
另一个测试:
19
-7 -9 0 1 -1 4 -3 -2 4 9 1 -9 -7 1 0 9 -7 -2 12
-9 -9 -7 -7 -7 -3 -2 -2 -1 0 0 1 1 1 4 4 9 9 12
【讨论】:
以上是关于计数排序算法 - 以负整数和正整数作为输入(不允许使用 Map)的主要内容,如果未能解决你的问题,请参考以下文章