Сортировка массива на основе индексного массива в C

#c

#c

Вопрос:

Я пытаюсь отсортировать множество массивов параллельно. Я сортирую один массив с помощью qsort и возвращаю массив int, который определяет индексы их исходных позиций. Теперь с этим массивом int мне нужно отсортировать другие массивы.

Массив 1:

  zzz
 yyy
 def
 abc
 cde
 xxx
  

после сортировки я получаю массив индексов и отсортированный массив: массив позиций Idx

 3   :    abc
4   :    cde
2   :    def
5   :    xxx
1   :    yyy
0   :    zzz
  

Теперь, основываясь на этом массиве индексов, мне нужно отсортировать другой массив

 a
b
c
d
e
f
  

так что это становится

 d
e
c
f
b
a
  

Большое спасибо

Комментарии:

1. Покажите нам код, который вы написали на данный момент.

2. Расскажите нам, когда вы делаете домашнее задание, и расскажите, что вы пробовали. Ответ на ваш вопрос очень прост, и вы не добьетесь никакого прогресса, если вам его передадут.

Ответ №1:

 for (i=0; i < 6;   i)
  SortedArray[IndexArray[i]] = AnotherArray[i];
  

Ответ №2:

В этом коде показаны два способа сделать это:

Первый способ делает это с использованием qsort() .. на чистом C, но потребляет немного больше памяти

 struct pair {
    int distance;
    int index;
};

int my_pair_compare(const void *const first, const void *const second)
{
    const pair* a = (const pair*)first;
    const pair* b = (const pair*)second;
    if (a->distance > b->distance)
       return 1;
    else if (a->distance < b->distance)
        return -1;
    else
        return 0;
}

void calculate_new_order1(int week_count, float distances[], int new_order[])
{
    struct pair ab[week_count];
    for (int i = 0; i<week_count;   i) {
        ab[i].distance = distances[i];
        ab[i].index = i;
    }
    qsort(ab, week_count, sizeof(*ab), my_pair_compare);
    for (int i=0; i<week_count;   i){
        new_order[i] = ab[i].index;
    }
}
  

The seconds сохраняет расстояния (в моем примере) на карте, а затем выполняет итерацию по карте. Способ C .

 void calculate_new_order2(int week_count, float distances[], int new_order[])
{
    std::map<float,int> ooo;
    for (int week=0; week<week_count; week  ) {
        ooo[distances[week]] = week;
    }
    int t = 0;
    for (auto i=ooo.begin(); i!=ooo.end(); i  ) {
        new_order[t] = i->second;
        t  ;
    }
}
  

Проблема со вторым решением заключается в том, что если у вас есть две «недели» с одинаковым расстоянием, это приведет к сбою, поскольку значения сохраняются в одном и том же индексе карты.