计数排序算法 - 以负整数和正整数作为输入(不允许使用 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?你也有驱动代码,你能解释一下现在出了什么问题吗? 我担心您的参数不会尊重 C1 个整数的数组 请出示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)的主要内容,如果未能解决你的问题,请参考以下文章

吴裕雄--天生自然数据结构:十大经典排序算法——计数排序

漫画算法22计数排序的优化

计数排序(Counting Sort)

8计数排序

计数排序(Counting Sort)

重温基础算法内部排序之计数排序法