【发布时间】:2016-01-19 08:14:21
【问题描述】:
我正在尝试使用合并排序算法对列表进行排序,同时保留其原始索引。有人告诉我,直接的解决方案是使用索引数组(显然它将被初始化为 0 1 2 3 ...),并在合并排序中更改它,因为我更改了原始中的相应值大批。 问题是,我找不到让它工作的方法,因为合并排序不使用原始数组的索引,而是使用原始数组拆分成的小数组的索引。我想我在这里遗漏了一些东西......到目前为止我想到的解决方案是将索引数组视为原始数组,我的意思是将其拆分为更小的数组,为新索引声明一个“helperIndexArray”,调用合并与这些变量等......但它似乎真的效率低下。没有更好的方法吗? 我会很感激任何提示,谢谢!
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]; }
}
【问题讨论】:
标签: c arrays sorting mergesort