Я хочу отсортировать int *arr
в порядке убывания и в то же время поменять местами соответствующие элементы массива char **words
, если второй элемент целого *arr
больше первого.Как я могу сделать это, используя qsort()
и cmpfunc()
?
Не существует чистого способа сделать эту работу, как представлено, потому что это требует контекстной информации, которую qsort()
не передает вфункция сравнения: базовые адреса массивов arr
и words
.Фактически, последний даже не передается самому qsort()
.
В реализации, которая поддерживает потоки C11, жизнеспособной альтернативой является хранение этих указателей в хранилище, специфичном для потока , и пусть функция сравнения получит их оттуда.Затем вы можете вычислить индексы сравниваемых элементов как разность указателей между ними и базовым указателем, и вы можете выполнить обычный обмен words
, используя его базовый указатель и полученные вами индексы.
Но это, вероятно, не то, что вы действительно хотите! Я предполагаю, что вы пытаетесь получить ту же перестановку элементов words
, что и элементов arr
.То, что вы описываете, ни в коем случае не обязательно приведет к этому, потому что вы вообще не можете быть уверены, что qsort()
будет выполнять своп каждый раз, когда результат сравнения будет определенным образом.
Если действительно два массива должны бытьотдельно, правильный способ сделать это состоит в том, чтобы подготовить и отсортировать некоторый вспомогательный массив.В этой области есть несколько альтернатив, которые позволят вам либо изменить порядок одного или обоих основных массивов, либо получить к ним доступ, как если бы вы это сделали.Например, вы можете подготовить int (*perm)[2]
, где каждый элемент (int[2]
) содержит соответствующий элемент arr
и начальный индекс этого элемента.Затем вы сортируете этот массив массивов так, как вам нравится, и довольно быстро получаете перестановку.Затем вы можете либо переупорядочить arr
и words
для соответствия, либо косвенный доступ к ним посредством перестановки (words[perm[k][1]]
).
Но вы также можете подумать о написании собственной целевой сортировкифункция вместо использования qsort()
.Такая функция может принимать в качестве аргументов базовые указатели на оба массива - даже правильно набранные - и затем напрямую выполнять требуемую совместную сортировку.