这个例子做什么要求原来的问题,它按两个(或多个)阵列以同样的方式,而不必将数组元素组合成一个通用结构。
它使用一个指针数组,所以比较函数不需要知道它正在排序哪个数组,只需要排序元素的类型。可以修改它以根据其中一个数组对多个数组进行排序。
它创建指针数组以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