這個例子做什麼要求原來的問題,它按兩個(或多個)陣列以同樣的方式,而不必將數組元素組合成一個通用結構。
它使用一個指針數組,所以比較函數不需要知道它正在排序哪個數組,只需要排序元素的類型。可以修改它以根據其中一個數組對多個數組進行排序。
它創建指針數組以a[]
,使用qsort()
根據a[]
指針數組進行排序,然後使用排序指針重新排序到位既a[]
和b[]
(與排序指針恢復到副作用他們的初始狀態)。
重排序時間複雜度爲O(n),因爲每個商店都將元素放置在其排序位置。
#include <stdio.h>
#include <stdlib.h>
int compare(const void *pp0, const void *pp1)
{
int i0 = **(int **)pp0;
int i1 = **(int **)pp1;
if(i0 > i1)return -1;
if(i0 < i1)return 1;
return 0;
}
int main()
{
int a[3] = {2, 3, 1};
int b[3] = {4, 3, 2};
int *pa[3];
size_t i, j, k;
int ta, tb;
/* create array of pointers to a[] */
for(i = 0; i < sizeof(a)/sizeof(a[0]); i++)
pa[i] = &a[i];
/* sort array of pointers */
qsort(pa, sizeof(a)/sizeof(a[0]), sizeof(pa[0]), compare);
/* reorder a[] and b[] according to the array of pointers */
for(i = 0; i < sizeof(a)/sizeof(a[0]); i++){
if(i != pa[i]-a){
ta = a[i];
tb = b[i];
k = i;
while(i != (j = pa[k]-a)){
a[k] = a[j];
b[k] = b[j];
pa[k] = &a[k];
k = j;
}
a[k] = ta;
b[k] = tb;
pa[k] = &a[k];
}
}
for(i = 0; i < sizeof(a)/sizeof(a[0]); i++)
printf("%2d ", a[i]);
printf("\n");
for(i = 0; i < sizeof(a)/sizeof(a[0]); i++)
printf("%2d ", b[i]);
printf("\n");
return 0;
}
使用標準功能** [的qsort(http://www.cplusplus.com/reference/cstdlib/qsort/)**此 – amdixon
'陣列(實際上指針)'....氣味麻煩。 –
您是否真的必須先排序一個數組,然後將相同的轉換應用於另一個數組,或者可以同時進行嗎? – molbdnilo