我試圖用合併排序算法對列表進行排序,同時保留它的原始索引。我被告知,直接的解決方案是使用一個索引數組(顯然它會被初始化爲0 1 2 3 ...),並在合併排序中對其進行更改,因爲我更改了原始數據中的對應值陣列。 事情是,我找不到一種方法來使它工作,因爲合併排序不使用原始數組的索引,而是原始數組分割的小數組的索引。我想我在這裏丟失了一些東西......我到目前爲止考慮的解決方案是將索引數組視爲原始數組,我的意思是將其分割成更小的數組,爲新索引聲明一個「helperIndexArray」,調用合併與這些變量等......但它似乎真的不夠高效。沒有更好的方法嗎? 我很感激任何提示,謝謝!在使用合併排序時保留原始索引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]; }
}