Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.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
在c中对数组排序就是删除值_C_Arrays_Quicksort_Genetic Algorithm_Shellsort - Fatal编程技术网

在c中对数组排序就是删除值

在c中对数组排序就是删除值,c,arrays,quicksort,genetic-algorithm,shellsort,C,Arrays,Quicksort,Genetic Algorithm,Shellsort,我正在编程一个遗传算法,这样就解决了线性规划的问题,我在使用C语言,当我计算变量的极限时,我保留了这些值​​在浮点型数组中,我需要对该数组进行排序,但它会删除一个我需要在排序时删除的数据:我使用了我自己创建的shell_排序和在标准库管理员中实现的qsort,两者都会给我相同的结果,我附加了用于排序的算法代码和用于qsort()的比较器函数: void shell_排序(float*A,int n){ int gap=n/2;//Se obtiene el-gap dividiendo el-t

我正在编程一个遗传算法,这样就解决了线性规划的问题,我在使用C语言,当我计算变量的极限时,我保留了这些值​​在浮点型数组中,我需要对该数组进行排序,但它会删除一个我需要在排序时删除的数据:我使用了我自己创建的shell_排序和在标准库管理员中实现的qsort,两者都会给我相同的结果,我附加了用于排序的算法代码和用于qsort()的比较器函数:

void shell_排序(float*A,int n){
int gap=n/2;//Se obtiene el-gap dividiendo el-tamaño de arreglo entre dos
int内部、外部、交换;//变量辅助变量
当(间隙>0){//Mientras间隙为零时:
对于(外部=间隙;外部缺口-1&&A[内部缺口]>交换){//Mientras内海市长que gap menos 1 y que su POSION内海市长que menos gap sea MAYER A交换
A[inner]=A[inner-gap];//内部的位置
内部-=间隙;//间隙向量的内部递减
}
A[inner]=swap;//La posicion inner de A tomo como nuevo valor swap
}
间隙//=2;//se将间隙分成两部分
}
}
比较器功能:

int comp(const void * a, const void * b){
    if(*(float*)a < *(float*)b) return -1;
    if(*(float*)a == *(float*)b) return 0;
    if(*(float*)a > *(float*)b) return 1;
}
int comp(常数无效*a,常数无效*b){
如果(*(浮动*)a<*(浮动*)b)返回-1;
如果(*(float*)a==*(float*)b)返回0;
如果(*(浮动*)a>*(浮动*)b)返回1;
}
输出: 我想当我对数组排序时,结果将是0,26,37,但结果是26,37,我需要零,我真的不知道为什么会发生这种情况

希望有人能帮助我

这是我使用排序时的一段代码

    Limites obtenerValoresLimites(lista *l,char var){
        //This code works
Limites lim;
        restriccion r;
        int i,j;
        float *aux = (float*)malloc(sizeof(float));
        for (i = 0; i < Size(l); i++)
        {
            r = Element(l,i+1);
            for (j = 0; j < strlen(r.variables); j++)
            {
                if(r.variables[j] == var){
                    aux[i] = (r.limite/r.coeficientes[j]);
                    }
            }
        }
    //First print of the output that confirms the zero originally exist

        //for (i = 0; i < sizeof(aux)/sizeof(*aux) ;i++)
            //printf("%f\n",aux[i]);

    //Sorting
        //qsort(aux,sizeof(aux)/sizeof(*aux)+1,sizeof(float),comp);
        shell_sort(aux,sizeof(aux)/sizeof(*aux));

        //printf("\n");
    //Second print of the output now the zero is no longer in the array
        //for (i = 0; i < sizeof(aux)/sizeof(*aux) ;i++)
        //{
        //  printf("%f\n",aux[i]);
        //}

        lim.inferior = 0;
        lim.superior = aux[(sizeof(aux)/sizeof(*aux))-1];
        lim.variable = var;

        return lim;
    }
限制从价煤(lista*l,char var){
//此代码有效
限制lim;
洗手间;
int i,j;
float*aux=(float*)malloc(sizeof(float));
对于(i=0;i
谢谢你的回答和阅读

我认为代码有点难读,这是因为我们使用了一些数据结构来建模问题,所以如果您感兴趣,我们将gitHub repo留在下面


如果您感兴趣,请完成代码:

正如我所怀疑的,问题在于如何调用排序函数

shell_sort(aux,sizeof(aux)/sizeof(*aux));
sizeof(aux)/sizeof(*aux)
构造只适用于纯数组,不适用于指针(也不适用于指向已分配内存的指针)。 当您使用
malloc
&friends分配内存时,您事先知道大小, 将其存储在变量中,并在调用排序时使用该变量 函数或预期数组大小的任何其他函数

因为
sizeof(aux)/sizeof(*aux)
是错误的,所以您正在访问超出限制的内存,因此这会产生未定义的行为。 在调用排序函数之前也是如此。你是 做

对于
i
大于1的值(假设
Size(l)
大于1)

我想,您必须根据您的代码分配适当的内存量 您需要
大小(l)
空格。因此,正确的分配应该是

size_t len = Size(l);
float *aux = malloc(len * sizeof *aux);
if(aux == NULL)
{
    fprintf(stderr, "Not enough memory\n");
    return SOME_ERROR_VALUE;
}

for (i = 0; i < len; i++)
{
    ...
}

shell_sort(aux, len);

...

lim.inferior = 0;
lim.superior = aux[len-1];
lim.variable = var;
size\u t len=尺寸(l);
浮动*aux=malloc(长度*sizeof*aux);
如果(aux==NULL)
{
fprintf(stderr,“内存不足”\n);
返回一些错误值;
}
对于(i=0;i

还有,是时候了。另外,请学习如何创建。如果您说标准库的sort和qsort都返回相同的结果,那么我认为问题出在其他地方,可能您认为数组中有一个0,或者您将不正确的大小传递给两个排序函数。演示如何调用排序函数。最好还是发一个@Pable,或者他说
qsort
也坏了。@DavidC.Rankin是的,我知道,但是
qsort
坏了而不是OP的代码的可能性非常小。这并不是说,
qsort
是由glibc(或任何其他经过良好测试的libc实现)的维护者的朋友昨天编写的。有趣的是:当我还是一个初学者时,我经常认为我在libc中发现了一个bug,因为一些标准函数并没有按预期工作,而且总是我错误地使用了它。@Pablo在我一年级的学生中对我大喊大叫(我是一名助手),因为
read()
被“窃听”;)即使四年过去了,当我看到他们时,我仍然会笑。他们一直这样说了6个小时,最后才终于理解了
read()
;)的行为真正有趣的是不断地说“读你喜欢的男人的书”
aux[i] = (r.limite/r.coeficientes[j]);
size_t len = Size(l);
float *aux = malloc(len * sizeof *aux);
if(aux == NULL)
{
    fprintf(stderr, "Not enough memory\n");
    return SOME_ERROR_VALUE;
}

for (i = 0; i < len; i++)
{
    ...
}

shell_sort(aux, len);

...

lim.inferior = 0;
lim.superior = aux[len-1];
lim.variable = var;