#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, которая делает то, что вы хотите.