Сортировка, Сортировка по индексам... |
1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!
Сортировка, Сортировка по индексам... |
Vardes |
Сообщение
#1
|
Пионер Группа: Пользователи Сообщений: 131 Пол: Мужской Репутация: 0 |
Сейчас изучаю сортировки, и мне необходимо найти какую-нить дополнительную инфу для сортировки по ИНДЕКСАМ. Весь сайт ваш облазил, но ничего путного не нашёл. Помогите кто чем может.
|
klem4 |
Сообщение
#2
|
Perl. Just code it! Группа: Пользователи Сообщений: 4 100 Пол: Мужской Реальное имя: Андрей Репутация: 44 |
Единственное, что может быть, мне кажется, тебе нужно кроме самого массива, заводить еще и массив индексов, потом в сортировке проходить по основному массиву, и если найдены 2 неупорядоченных лемента, то поменять местами соответствующие элементы в массиве индексов.
(каждый элемента массива индексов содержит собственный номер, т.е. a[1] = 1, a[2] = 2...a[n] = n); Кстати возможно это имеет смысл, если менять местами при сортировки приходится очень большие структуры, хотя ... кто его знает. Сообщение отредактировано: klem4 - -------------------- perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
|
Vardes |
Сообщение
#3
|
Пионер Группа: Пользователи Сообщений: 131 Пол: Мужской Репутация: 0 |
Допустим:
2 7 1 4 6 15 18 9 112 0 массив чисел 1 2 3 4 5 6 7 8 9 10 массив индексов Если взять последний эл-т в массиве чисел и начинать его перестанавливать, то первый шаг у нас будет таким,если я не ошибаюсь: 1 2 3 4 5 6 7 8 10 9, а как же нам запомнить то,что мы 112 и 0 поменяли местами, вот самый главный вопрос,в который я никак не вникнуть |
hardcase |
Сообщение
#4
|
code warrior Группа: Пользователи Сообщений: 484 Пол: Мужской Реальное имя: Славен Репутация: 8 |
Мы меням местами не сами значения а ИНДЕСЫ, представь, что ИНДЕКС - это нечто вроде УКАЗАТЕЛЯ в кучу - мы ведь при перестановке меняем местами только указатели а не обмениваем содержимое памяти. В данном случа нам не интересно, как расположены числа в основном массиве - нас интересует расположение ИНДЕКСОВ - ведь мы сортируем какраз этот массив (выбирая информацию для сравнения из массива чисел).
-------------------- ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
|
Vardes |
Сообщение
#5
|
Пионер Группа: Пользователи Сообщений: 131 Пол: Мужской Репутация: 0 |
Ну это мне понятно,что мы меняем местами индексы, а не сами эл-ты массива. Вопрос всё же в том,что массив индексов зависит от массива чисел,и как же проходит реализация последущего сравнения эл-ов в массиве чисел,если там мы изменения никаких не делаем.Или же каждому значению эл-та из массива индексов соответствует значение эл-та из массива чисел.Вроде вот этого :
a: 2 7 1 3 5 2 0 b: 1 2 3 4 5 6 7 a[b[1]]:=2 a[b[2]]:=7 ..... ..... |
hardcase |
Сообщение
#6
|
code warrior Группа: Пользователи Сообщений: 484 Пол: Мужской Реальное имя: Славен Репутация: 8 |
Да, сравнивать нужно таким образом:
Код values[indexes[ind_a]] < values[indexes[ind_b]] А то, что лежит в массиве чисел - не важно, мы можем изменить некоторое значение в этом массиве и заново запустить сортировку - и мы получим сортированный массив индесков уже с учётом последнего изменения. Т.е. смотри - мы сортируем массив ИНДЕКСОВ, но критерием сравнения являются не сами целочисленные значения индексов, а числа, которые лежат в массиве чисел по этим индексам. Поэтому нам не важно, как расположены числа. Сообщение отредактировано: hardcase - -------------------- ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
|
Vardes |
Сообщение
#7
|
Пионер Группа: Пользователи Сообщений: 131 Пол: Мужской Репутация: 0 |
Если я всё же вас правильно понимаю, то мы просто берём начальный массив, делаем его копию и работаем уже с его копией. Так или всё же до меня так плохо доходит !?
|
hardcase |
Сообщение
#8
|
code warrior Группа: Пользователи Сообщений: 484 Пол: Мужской Реальное имя: Славен Репутация: 8 |
Вероятно до тебя плохо доходит.
Ничета мы на копируем. Идея работы с индексами аналогична идеи работы с указателями, только если в случае с указателям мы должны разыменовать указатель, чтоб добраться до самого значения; то с индексами мы должы всего лишь обратиться к указанному элементу массива. -------------------- ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
|
Vardes |
Сообщение
#9
|
Пионер Группа: Пользователи Сообщений: 131 Пол: Мужской Репутация: 0 |
Всё, вроде теперь догнал. Ещё и с кодом разобрался. Вот программка, которая сортирует 10 чисел. Возможно, модераторы смогут это выложить в FAQ, а то, что-то совсем на сайте нет ничего про сортировку по ИНДЕКСАМ
Всем спасибо за помощь Код type index = array[1..10] of integer; Var i,j,k :integer; b:index; a:array[1..10] of integer; begin for i:=1 to 10 do read(a[i]); for i:=1 to 10 do b[i]:=i; for i:=2 to 10 do for j:=10 downto i do if a[b[j-1]]>a[b[j]] then begin k:=b[j-1]; b[j-1]:=b[j]; b[j]:=k; end; for i:=1 to 10 do write(a[b[i]]); end. Сообщение отредактировано: Vardes - |
Текстовая версия | 11.01.2025 6:40 |