Я пытаюсь сортировать список с помощью Merge Sort algoritm, сохраняя его исходные индексы. Мне сказали, что прямолинейное решение состоит в том, чтобы использовать массив индексов (очевидно, он будет инициализирован 0 1 2 3 ...) и изменить его внутри сортировки слияния, поскольку я изменяю соответствующие значения в оригинале массив. Дело в том, что я не могу найти способ заставить его работать, потому что сортировка слияния не использует индексы исходного массива, а скорее индексы небольших массивов, в которые разбивается исходный массив. Наверное, я что-то пропустил ... решение, о котором я думал до сих пор, состояло в том, чтобы обрабатывать массив индексов точно так же, как и исходный, я имею в виду разбить его на меньшие массивы, объявить «helperIndexArray» для новых индексов, вызвать слияние с этими переменными и т. д. Но это кажется действительно неэффективным. Разве нет лучшего способа? Буду признателен за любые советы, спасибо!Сохранение исходных индексов при сортировке с помощью Merge Sort in c
void internalMsort(int array[], int size, int helperArray[], int index[]) {
int left = size/2, right = size - left;
if (size < 2)
return;
internalMsort(array, left, helperArray);
internalMsort(array + left, right, helperArray);
merge(array, left, array + left, right, helperArray, index);
memCpy(array, helperArray, size);
}
void merge(int a[], int na, int b[], int nb, int c[], index[]) {
int ia, ib, ic;
for(ia = ib = ic = 0; (ia < na) && (ib < nb); ic++)
{
if(a[ia] < b[ib]) {
c[ic] = a[ia];
ia++;
// here I was trying to swap index[ic] with index[ia] but it didn't work
}
else {
c[ic] = b[ib];
ib++;
}
}
for(;ia < na; ia++, ic++){ c[ic] = a[ia]; }
for(;ib < nb; ib++, ic++) { c[ic] = b[ib]; }
}