在 c 中对数组进行排序是删除值
Sorting an array in c is deleting values
我正在编写遗传算法,以便解决线性规划问题,我正在使用 C 语言,当我计算变量的极限时,我将值保存在浮点型数组中,我需要排序该数组但它删除了我在订购时需要的数据:我使用了一个由我编程的 shell_sort 和在标准图书管理员中实现的 qsort 并且两者都给我相同的结果,我附加代码我用来排序的算法和我用于 qsort () 的比较器函数:
void shell_sort(float *A, int n){
int gap = n/2; //Se obtiene el gap dividiendo el tamaño de arreglo entre dos
int inner, outer, swap; //Variables auxiliares
while (gap > 0) { //Mientras gap sea mayor que zero entonces:
for(outer = gap; outer < n; outer++){ // Para outer igual a gap, siempre que outer sea menor a n, outer aumentara su valor en uno
inner = outer; // inner se iguala al valor de outer
swap = A[inner]; // Swap se iguala a la posiscion inner de A
while (inner > gap - 1 && A[inner - gap] > swap ) { // Mientras inner sea mayor que gap menos 1 y que A en su posicion inner menos gap sea mayor a Swap
A[inner] = A[inner - gap]; //La posicion inner de A tomara como nuevo valor la posicion inner menos gap de A
inner -= gap; //inner decrementa su valor en gap veces
}
A[inner] = swap; //La posicion inner de A tomo como nuevo valor swap
}
gap /=2; // se divide a gap entre dos
}
}
比较函数:
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;
}
输出:
Output
我想当我对数组进行排序时,结果将是 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;
}
感谢您的回答和阅读。
我认为代码有点难以阅读,这是因为我们正在使用一些数据结构来模拟问题,所以如果您有兴趣,我们将 gitHub 回购留在下面。
如果您对以下内容感兴趣,请完成代码:https://github.com/JoelRomero97/Metodos-Cuantitativos.git
正如我所怀疑的,问题在于您如何调用排序函数。
shell_sort(aux,sizeof(aux)/sizeof(*aux));
sizeof(aux)/sizeof(*aux)
构造仅适用于纯数组,不适用于指针(也不适用于指向已分配内存的指针)。
当你用 malloc
& friends 分配内存时,你事先知道大小,
将它存储在一个变量中,并在调用排序时使用该变量
函数或任何其他需要数组大小的函数。
因为 sizeof(aux)/sizeof(*aux)
是错误的,你正在访问超出限制的内存,所以这会产生未定义的行为。
在调用排序函数之前也是如此。你是
做
aux[i] = (r.limite/r.coeficientes[j]);
对于 i
的值大于 1(假设 Size(l)
大于 1)。
我想你必须根据你的代码分配适当数量的内存
你需要 Size(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;
此外,don't cast malloc
我正在编写遗传算法,以便解决线性规划问题,我正在使用 C 语言,当我计算变量的极限时,我将值保存在浮点型数组中,我需要排序该数组但它删除了我在订购时需要的数据:我使用了一个由我编程的 shell_sort 和在标准图书管理员中实现的 qsort 并且两者都给我相同的结果,我附加代码我用来排序的算法和我用于 qsort () 的比较器函数:
void shell_sort(float *A, int n){
int gap = n/2; //Se obtiene el gap dividiendo el tamaño de arreglo entre dos
int inner, outer, swap; //Variables auxiliares
while (gap > 0) { //Mientras gap sea mayor que zero entonces:
for(outer = gap; outer < n; outer++){ // Para outer igual a gap, siempre que outer sea menor a n, outer aumentara su valor en uno
inner = outer; // inner se iguala al valor de outer
swap = A[inner]; // Swap se iguala a la posiscion inner de A
while (inner > gap - 1 && A[inner - gap] > swap ) { // Mientras inner sea mayor que gap menos 1 y que A en su posicion inner menos gap sea mayor a Swap
A[inner] = A[inner - gap]; //La posicion inner de A tomara como nuevo valor la posicion inner menos gap de A
inner -= gap; //inner decrementa su valor en gap veces
}
A[inner] = swap; //La posicion inner de A tomo como nuevo valor swap
}
gap /=2; // se divide a gap entre dos
}
}
比较函数:
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;
}
输出: Output 我想当我对数组进行排序时,结果将是 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;
}
感谢您的回答和阅读。
我认为代码有点难以阅读,这是因为我们正在使用一些数据结构来模拟问题,所以如果您有兴趣,我们将 gitHub 回购留在下面。
如果您对以下内容感兴趣,请完成代码:https://github.com/JoelRomero97/Metodos-Cuantitativos.git
正如我所怀疑的,问题在于您如何调用排序函数。
shell_sort(aux,sizeof(aux)/sizeof(*aux));
sizeof(aux)/sizeof(*aux)
构造仅适用于纯数组,不适用于指针(也不适用于指向已分配内存的指针)。
当你用 malloc
& friends 分配内存时,你事先知道大小,
将它存储在一个变量中,并在调用排序时使用该变量
函数或任何其他需要数组大小的函数。
因为 sizeof(aux)/sizeof(*aux)
是错误的,你正在访问超出限制的内存,所以这会产生未定义的行为。
在调用排序函数之前也是如此。你是
做
aux[i] = (r.limite/r.coeficientes[j]);
对于 i
的值大于 1(假设 Size(l)
大于 1)。
我想你必须根据你的代码分配适当数量的内存
你需要 Size(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;
此外,don't cast malloc