Любопытный случай сортировки двух массивов в тандеме - PullRequest
3 голосов
/ 26 мая 2011

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

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

Итак, мы хотим отсортировать массив a.Таким образом, результат сортировки должен быть a_sorted = [3,4,7,8].И мы не должны сортировать массив б.Вместо этого порядок массива 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]]

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

Ответы [ 5 ]

3 голосов
/ 26 мая 2011

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

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

2 голосов
/ 27 мая 2011

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

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

OR

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

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

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

2 голосов
/ 26 мая 2011

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

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

1 голос
/ 26 мая 2011

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

0 голосов
/ 01 августа 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...