重新排序,通過旋轉「週期」對A []和I []進行排序。每個商店都在適當的位置放置一個值,因此時間複雜度爲O(n)。
// reorder A in place according to sorted indices in I
// tA is temp value for A
for(i = 0; i < n; i++){
if(i != I[i]){
tA = A[i];
k = i;
while(i != (j = I[k])){
A[k] = A[j];
I[k] = k;
k = j;
}
A[k] = tA;
I[k] = k;
}
}
我剛纔注意到您使用的是C.在C++中,你可以使用lambda比較功能來比較的A [],基於指數的成員,我[]。對於C,可以使用指針數組P []而不是索引數組I []。
/* create array of pointers to A[] */
for(i = 0; i < n; i++)
P[i] = &A[i];
/* sort array of pointers, compare is custom compare function */
qsort(P, n, sizeof(P[0]), compare);
/* reorder A[] according to the array of pointers */
for(i = 0; i < n; i++){
if(i != P[i]-a){
tA = A[i];
k = i;
while(i != (j = P[k]-a)){
A[k] = A[j];
P[k] = &A[k];
k = j;
}
A[k] = tA;
P[k] = &A[k];
}
}
如果A []包含整數,則示例自定義比較qsort()。由於qsort()將指向P []的指針作爲參數傳遞給compare(),並且由於P []是一個指針數組,因此傳遞給compare()的參數是指向指針的指針。
int compare(const void *pp0, const void *pp1)
{
return((**(int **)pp0) - (**(int **)pp1));
}
如果目標是要排序的第二陣列B [],基於排序A [],然後添加線條像:
/* ... just after tA = A[i] */
tB = B[i];
/* ... just after A[k] = A[j] */
B[k] = B[j];
/* ... just after A[k] = tA */
B[k] = tB;
是否問題[代替陣列重新排序(HTTPS: //stackoverflow.com/questions/7365814/in-place-array-reordering)幫助? –