Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 计数排序错误消息_Arrays_Segmentation Fault_Malloc - Fatal编程技术网

Arrays 计数排序错误消息

Arrays 计数排序错误消息,arrays,segmentation-fault,malloc,Arrays,Segmentation Fault,Malloc,我试图用C语言实现一个计数排序算法,但在测试一百万个整数的过程中,我不断发现分段错误。需要帮忙吗?我的代码如下(“type.h”给出了无符号int数据类型的typedef“unit”): #包括 #包括“csort.h” #包括 #包括“h型” 无符号整数* 计数排序(无符号整数*A,整数n){ uint i,j,l=0,k=0; uint*C; 对于(i=0;ik) k=A[i]; C=(uint*)malloc((sizeof(uint))*(k+1)); 对于(i=0;i所有整数的最大值是

我试图用C语言实现一个计数排序算法,但在测试一百万个整数的过程中,我不断发现分段错误。需要帮忙吗?我的代码如下(“type.h”给出了无符号int数据类型的typedef“unit”):

#包括
#包括“csort.h”
#包括
#包括“h型”
无符号整数*
计数排序(无符号整数*A,整数n){
uint i,j,l=0,k=0;
uint*C;
对于(i=0;ik)
k=A[i];
C=(uint*)malloc((sizeof(uint))*(k+1));

对于(i=0;i所有整数的最大值是多少?如果它非常大(例如
2*10^9
),则可能会遇到分配
2*10^9*sizeof(int)的问题
这可能会发现分段错误。

最大整数非常大,但我使用的是无符号整数的数据类型。那么我应该怎么做来纠正这个问题呢?不,问题不在于数据类型。问题是您分配了非常大的内存块。在本例中,Couting sort不起作用,因为您不知道整数的范围。要使计数排序工作,必要条件是项目的范围是已知的且较小的(比如100万)。在算法的最坏情况下,它需要
2*10^9*4字节=7.4 GB
=>分段错误。我建议在此问题中不要使用计数排序,而应使用更传统的排序(快速排序、合并排序)。然后你仍然使用
3.7GB
,它仍然非常大。如果说10000,你的代码肯定会工作。参考。计数排序可以接受的通常是100万以下。但它应该仍然工作。我的朋友为100万个大数的整数实现了计数排序算法,但它对他有效。
#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;
}