一个数组相对于另一个数组的qsort()

时间:2013-01-25 14:38:51

标签: c arrays sorting qsort

我想使用qsort()对b进行排序。你能给我这个功能吗?

α= {0,1,2,3,4} B = {3,4,5,1,2}

答案必须是{3,4,0,1,2}

请告诉我功能代码。

喜欢: int compare (const void *a,const void *b) { return(*(char *)a-*(char *)b); }

2 个答案:

答案 0 :(得分:2)

这是你现在拥有它的方式所不可能的,因为qsort()接受一个数组并将数组的元素相互比较。您需要创建一个包含两个值的结构的单个数组,如下所示:

#include <stdlib.h>
#include <stdio.h>

typedef struct {
    int a;
    int b;
} c_type;

int
compare(const void *a, 
        const void *b) {
    return ((c_type *)a)->b - ((c_type *)b)->b;
}

int
main(int argc,
     char *argv[])
{
    int i = 0;
    c_type array[] = {{0, 3}, {1, 4}, {2, 5}, {3, 1}, {4, 2}};

    qsort(array, sizeof array / sizeof(*array), sizeof(*array), compare);

    for ( i = 0; i < sizeof array / sizeof(*array); i++ ) {
       printf("%d\t", array[i].a);
    }
    printf("\n");

    return 0;
}

答案 1 :(得分:0)

您需要一种机制来通知比较函数要比较什么,而不是与存储在传递给它的地址中的值进行比较的普通实现。这可以通过 static(全局)存储实现:

#include<stdlib.h>

int *Array= NULL;
void SetArray(int *const array)
{
  Array= array;
}

int basecompare(const void *a, const void *b)
{
  return Array[*((int *) a)]- Array[*((int *) b)];
}
int main(int argc, char *argv[])
{
  int a[]= { 0, 1, 2, 3, 4 };
  int b[]= { 3, 4, 5, 1, 2 };
  size_t len= sizeof(a)/ sizeof(a[0]);

  SetArray(b);

  qsort(a, len, sizeof(int), basecompare);

  return 0;
}