Это показывает один из недостатков использования параллельных массивов вместо массива struct. Простым решением было бы преобразовать ваш код в
struct {int index, num;} a[] = {{index1, num1},{index2, num2}, ...};
Если ваша кодовая база уже интенсивно использует параллельные массивы, вы можете написать сортировку, которая знает о таких трудностях. Вы можете передать ему массив массивов, а не один, и написать сортировку для выполнения перестановок в каждом массиве, выполняя только сравнения первого. Другими словами:
void sort_pa(void **arrays/*NULL-terminated*/, int len,int size, int(*cmp)(...)))
Что бы вы потом использовали:
int a[] ={index1,index2,index3...indexI};
int b[] ={num1,num2,num3.......numI};
int *c[] = {b, a, NULL};
sort_pa(c, I, sizeof **c, cmp);