qsort() одного массива по отношению к другому массиву

Я хочу использовать qsort() для сортировки массива a по отношению к b. Можете ли вы дать мне функцию?

a={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); }


person in3o    schedule 25.01.2013    source источник
comment
На каком языке вы ищете код? ИЛИ Вы просто ищете алгоритм быстрой сортировки?   -  person Ravindra Gullapalli    schedule 25.01.2013
comment
Как именно рассчитывается результат? Можете ли вы показать нам, как этот результирующий массив строится из двух входных данных?   -  person Dominik Sandjaja    schedule 25.01.2013
comment
@RavindraGullapalli я ищу синтаксис в c.   -  person in3o    schedule 25.01.2013
comment
Отвечает ли это на ваш вопрос? использование qsort для одновременной сортировки двух массивов?   -  person qwr    schedule 16.06.2021


Ответы (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;
}
person SpacedMonkey    schedule 25.01.2013
comment
эта функция сравнения может переполниться, см. stackoverflow.com/a/27284248/3163618 - person qwr; 16.06.2021

Вам понадобится механизм, сообщающий функции сравнения, с чем сравнивать, а не ванильную реализацию сравнения со значениями, хранящимися в переданных ей адресах. Этого можно добиться с помощью 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;
}
person the_bond_007    schedule 12.04.2021