Я пытаюсь сделать следующее:
- Выделить память для массива размерности 7
- Напишите первые 4 позиции
- Отсортируйте эти 4 позиции.
- Напишите оставшиеся 3 позиции
- Отсортируйте весь массив.
У меня есть массив (1,6,2,3)
, который после сортировки становится (1,2,3,6)
Затем я записываю оставшиеся позиции, а именно (1,2,3,6,1,5,1)
После сортировки я должен получить (1,1,1,2,3,5,6)
, но вместо этого я получаю (6,2,3,1,1,5,1)
.
Вот код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int comp(const void* a, const void* b);
typedef struct{
int peso;
}aresta_;
int main(int argc, const char * argv[]) {
aresta_* array /*struct array, has field peso of type int*/;
int dim=7;
int dim_aux=4;
int i;
array = (aresta_*) malloc(dim * sizeof(aresta_));
array[0].peso=1;
array[1].peso=6;
array[2].peso=2;
array[3].peso=3;
printf("First sort:\n");
for(i=0; i<dim_aux; i++)
printf("%d ",array[i].peso);
printf("\n");
qsort(array, dim_aux, sizeof(array[0]), comp);
for(i=0; i<dim_aux; i++)
printf("%d ",array[i].peso);
printf("\n\n");
array[4].peso=1;
array[5].peso=5;
array[6].peso=1;
printf("Second sort:\n");
for(i=0; i<dim; i++)
printf("%d ",array[i].peso);
printf("\n");
qsort(array, dim, sizeof(array[0]), comp);
for(i=0; i<dim; i++)
printf("%d ",array[i].peso);
printf("\n");
}
Моя комп функция:
int comp(const void* a, const void* b)
{
aresta_* a1 = (aresta_*)a;
aresta_* b1 = (aresta_*)b;
return a1->peso > b1->peso;
}
Вывод:
First sort:
1 6 2 3
1 2 3 6
Second sort:
1 2 3 6 1 5 1
6 2 3 1 1 5 1
Program ended with exit code: 0
Где я ошибся? Любая помощь будет принята с благодарностью.
int
. - person Weather Vane   schedule 01.05.2017return a1->peso - b1->peso;
, но это может привести к арифметическому переполнению. Лучше привыкнуть кif(a1->peso > b1->peso) return 1; ...
и т. д. - person Weather Vane   schedule 01.05.2017return a1->peso > b1->peso;
точно такой же, какif(a1->peso > b1->peso) return 1 else return 0;
- person 4386427   schedule 01.05.2017...
в моем комментарии выше, который ОП прекрасно понял.if(a1->peso > b1->peso) return 1; if(a1->peso < b1->peso) return -1; return 0;
- person Weather Vane   schedule 01.05.2017a < b
,a > b
иa == b
. Вы не можете получить три значения из одного сравнения. - person crashmstr   schedule 01.05.2017return (a<b) ? -1 : a > b;
- person chux - Reinstate Monica   schedule 01.05.2017