Любопытный случай сортировки двух массивов в тандеме

#arrays #algorithm #sorting

#массивы #алгоритм #сортировка

Вопрос:

Предположим, у нас есть два массива:

 a = [4,3,8,7]
b = [(1,2),(5,6),(8,6),(9,0)] 
  

Итак, чего мы хотим сейчас, это сортировки массива a.
Итак, результат сортировки должен быть a_sorted = [3,4,7,8] .
И мы не должны сортировать массив b.
Вместо этого порядок массива b должен быть изменен в соответствии с порядком сортировки массива a.

Итак, массив b должен быть b_sorted = [(5,6),(1,2),(9,0),(8,6)]

т.е. порядок a_sorted будет a_sorted = [a[1],a[0],a[3],a[2]] . Соответственно, b_sorted = [b[1],b[0],b[3],b[2]]

Вопрос проще. Есть ли название для такого рода сортировки? :

Ответ №1:

Вы просто находите перестановку сортировки для одного массива ([2,1,4,3] для a) и применяете ее к другому. Многие языки хорошо справляются с этим.

Например, в Matlab вы можете вызвать [sortedA, sortedBy] = sort([4 3 8 7]); Then sortedA = a(sortedBy) = [3 4 7 8] и sortedBy = [2 1 4 3] , так что ваш новый b будет b(sortBy) .

Ответ №2:

На самом деле, такого рода вещи на самом деле не редкость, хотя сегодня они менее распространены, чем были в прошлом. Это расширение идеи сортировки тегов, где сортируются ключи, а затем соответствующие записи считываются и записываются по порядку. Обычно вы используете сортировку по тегам, когда:

  • Недостаточно памяти для загрузки всех записей, которые вы хотите отсортировать, но вы можете легко загрузить ключи.

или

  • Перемещение больших записей в памяти во время сортировки обходится очень дорого. Замена ключей занимает меньше времени.

Второй вариант на самом деле не является проблемой очень часто в наши дни, потому что вы обычно сортируете массив ссылок, а это означает, что единственными объектами, которые меняются местами, являются указатели — 4 байта или 8 байт каждый.

Некоторые API имеют встроенную поддержку этого типа параллельной сортировки массивов. Например, .У Array класса NET есть метод сортировки (array, массив), который работает точно так, как вы описываете.

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

1. Большое спасибо, Джим! Это, конечно, помогло 🙂

Ответ №3:

Я не думаю, что для такой вещи есть название. Обратите внимание, что такие «параллельные массивы» обычно не одобряются и часто используются людьми (студентами), новичками в программировании, которых не учили, как правильно использовать классы (без обид). Если существует связь между двумя массивами, их следует поместить в какой-то объект, а затем вместо этого отсортировать этот объект.

Конечно, все зависит от ситуации. Возможно, используется язык, который не имеет возможности группировать связанные атрибуты в (пользовательских) объектах.

Ответ №4:

Добавьте значения b к ключам a , чтобы получить многомерный массив. Затем отсортируйте этот массив.

Ответ №5:

Да, в PHP есть функция сортировки массивов, называемая array_multisort, которая делает то, что вы хотите.