【问题标题】:Counting Sort Error Message计数排序错误消息
【发布时间】:2013-03-12 01:05:35
【问题描述】:

我正在尝试使用 C 实现计数排序算法,但在测试一百万个整数期间我不断遇到分段错误。请问有什么帮助吗?我的代码如下("type.h" 为 unsigned int 数据类型提供 typedef "unit"):

#include <stdlib.h>
#include "csort.h"
#include <stdio.h>
#include "type.h"

unsigned int*
countingSort(unsigned int *A, int n) {
        uint i, j, l = 0, k = 0;
        uint *C;
        for (i = 0; i < n; i++)
            if (A[i] > k)
                    k = A[i];
        C = (uint*)malloc((sizeof(uint))*(k+1));
        for (i = 0; i <= k; i++)
            C[i] = 0;
        for (i = 0; i < n; i++)
            C[A[i]]++;
        for (i = 1; i < k; i++)
            for (j = 0; j < C[i]; j++)
                    A[l++] = i;
        free(C);
        return A;
}

我正在处理的输入是大数字,因此 k 很大。 n 是输入数组中的整数个数(一百万)。

【问题讨论】:

    标签: arrays segmentation-fault malloc


    【解决方案1】:

    所有整数的最大值是多少?如果它非常大(比如2*10^9),那么您可能会遇到分配2*10^9 * sizeof(int) 的问题,这可能会导致分段错误。

    【讨论】:

    • 最大整数很大,但是我使用的是无符号整数的数据类型。那我应该怎么做才能纠正呢?
    • 不,问题不在于数据类型。问题是您分配了非常大的内存块。计算排序在此示例中不起作用,因为您事先不知道整数的范围。要使计数排序起作用,必要条件是项目范围为known and small(例如 100 万)。在算法的最坏情况下,它需要2*10^9 * 4 bytes = 7.4 GB => 分段错误。我建议不要在这个问题中使用计数排序,而是使用更传统的排序(快速排序、合并排序)。
    • 那你还是用3.7GB 还是很大的。如果说 10000 你的代码肯定会工作。参考Counting Sort
    • 计数排序可接受的数量通常低于 100 万。
    • 但它应该仍然有效。我的朋友为 100 万个大整数实现了计数排序算法,但它对他有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-03
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多