【问题标题】:Counting sort with negative integers?用负整数计数排序?
【发布时间】:2019-04-28 07:50:04
【问题描述】:

我想修改我的计数排序算法以使用负整数。

这是我目前的情况(分段错误):

void counting_sort(int *vet, int max, int min, int n){

  int i, j, C[(max-min)+1], B[n];

  for (i=0;i<=max;i++){
    C[i]=0;
  }

  for (i=0;i<n;i++){
    C[vet[i]-min]++;
  }

  for (i=1;i<=(max-min);i++){
    C[i]=C[i]+C[i-1];
  }

  for (i=n-1;i>=0;i--){
    B[C[(vet[i])-min]-1]=vet[i];
    C[vet[i]-min]--;
  }

  for (i=0;i<n;i++){
    printf("%d ",B[i]);
  } 
}

【问题讨论】:

  • 你用gdb调试过你的代码吗?段错误发生在哪里?
  • 这一行似乎是问题所在:B[C[(vet[i])-min]-1]=vet[i];它试图访问大于我认为的向量长度的值
  • 使用调试器可以轻松找出!当您逐句执行代码时,您还可以监视和检查所有变量的值,并检查表达式的结果作为索引是否有效。
  • 我知道问题出在哪里(它试图访问大于向量长度的值)但真的不知道如何解决它,我在 C++ 中使用相同的逻辑实现了一个代码,它工作正常,但由于某种原因在 c 中不起作用,不幸的是它必须用 c 编写。
  • for (i=0;i&lt;=max;i++){ C[i]=0; } 不正确。请发帖minimal reproducible example

标签: c sorting counting-sort


【解决方案1】:

这个循环看起来有一个错误:

for (i=1;i<=(max-min+1);i++){
    C[i]=C[i]+C[i-1];
}

请注意,数组 C 中包含 max - min + 1 个元素,因此如果您迭代到 并包括 索引 max - min + 1,则您正在注销数组的末尾.

这里可能还有其他问题,但我会先调查一下。

【讨论】:

    【解决方案2】:

    我不知道是什么导致了分段错误,但是如果你想使用计数排序对负数进行排序,你只需要找到数组中最小的负数并将绝对值添加到临时数组的所有值中。之后,使用正常的计数排序算法对数组进行排序,然后从得到的数组中的每个数字中减去最小的最小值。


    从数组的所有元素中加/减一个数字不影响排序结果。

    【讨论】:

    • ... 你描述的方法似乎正是 OP 想要做的。
    【解决方案3】:

    您可以将其更改为按正序排序:

        int i, j, C[(max-min)+2], B[n];   // ...+2...
        for (i=0;i<=(max-min)+1;i++){     // ...+1...
            C[i]=0;
        }
        for (i=0;i<n;i++){
            C[vet[i]+1-min]++;            // ...+1...
        }
        for (i=2;i<=(max-min);i++){       // i = 2
            C[i]+=C[i-1];
        }
        for (i=0;i<n;i++){                // 0 to n-1 sort
            B[C[vet[i]-min]++]=vet[i];
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-21
      • 1970-01-01
      • 1970-01-01
      • 2013-04-11
      • 2014-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多