Насколько я понимаю, вы намерены сохранить массив degree
в его нынешнем порядке.Если вы хотите выполнить совместную сортировку с массивом вершин, вам нужно написать собственную процедуру сортировки;qsort
не будет выполнять эту работу.
Конечно, если вы не выполняете совместную сортировку degree
, тогда должно быть четко определенное отображение 1-1 из значений из vertex
элементов к индексам из degree
элементов, иначе нет способа определить, какая степень соответствует какой вершине после начала сортировки.Это похоже на случай с вашим примером: значения вершин на единицу больше, чем индексы соответствующих им элементов degree
.
Чтобы отсортировать массив vertex
по degree
без изменения degree
, функция сравнения, представленная qsort
, должна иметь возможность доступа к degree
через переменную области файла.Если degree
само не объявлено в области видимости файла, вы можете добавить переменную-указатель области видимости файла и установить для нее значение degree
.Конечно, это имеет ограничение, заключающееся в том, что вы не можете выполнять несколько прогонов сортировки одновременно.
После настройки функция сравнения использует номера вершин для доступа к степеням вершин из массива и сравнивает их на основе этихРезультаты.Это будет выглядеть примерно так:
#include <stdlib.h>
#include <stdio.h>
typedef unsigned int u32;
u32 *vert_degree;
int compare_vertices(const void *v1, const void *v2) {
u32 degree1 = vert_degree[*(const u32 *)v1 - 1];
u32 degree2 = vert_degree[*(const u32 *)v2 - 1];
if (degree1 > degree2) {
return -1;
} else if (degree1 < degree2) {
return 1;
} else {
return 0;
}
}
int main(void) {
u32 degree[] = {2,3,3,2,2,2};
u32 vertex[] = {1,2,3,4,5,6};
vert_degree = degree;
qsort(vertex, 6, sizeof(vertex[0]), compare_vertices);
printf("%d", vertex[0]);
for (int i = 1; i < 6; i++) {
printf(", %d", vertex[i]);
}
putchar('\n');
return 0;
}
Вывод:
2, 3, 1, 4, 5, 6
Если вы оказались в системе на основе glibc (например, Linux), то у вас также есть возможность использовать qsort_r
, который принимает вспомогательные данные, такие как массив degree
, и передает их для сравненияфункция (которая поэтому должна принимать дополнительный параметр).Это позволяет вам не полагаться на глобальные переменные, но это специфично для glibc.