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