сортировка в типизированном файле

Алгоритмы: от сортировки пузырьком до численных методов

Модераторы: C_O_D_E, DeeJayC

Ответить
Аватара пользователя
Oleg_Rus
Сообщения: 335
Зарегистрирован: 16 окт 2006, 09:56
Откуда: г.Улан-Удэ, респ.Бурятия, Российская Федерация
Контактная информация:

такой вопрос: как отсортировать записи в типизированном файле? много думал над этим вопросом, но ничего не смог придумать... А у нас это чуть ли не в каждой курсовой.
e-mail: garmayev@yandex.ru
---------------------------------------------------------------------------
<a href="http://nick-name.ru/sertificates/711965/"><img src="http://nick-name.ru/img.php?nick=Garmay ... =2&text=t5" alt="Никнейм Garmayev зарегистрирован!" /></a>
airyashov
Сообщения: 441
Зарегистрирован: 02 ноя 2007, 10:31

индекс сделать самое простое
MOTOCoder
Сообщения: 548
Зарегистрирован: 14 янв 2008, 20:27
Откуда: Россия, Псков

Если число записей ограничено по условию, можно записать все в массив, отсортировать его стандартным методом и записать обратно. Если нет - нужно сортировать прямо в файле. Тут, наверное, пойдет стандартный алгоритм сортировки, только придется работать прямо с файлом.
Ни что так не ограничивает фантазию программиста, как компилятор...
Аватара пользователя
somewhere
Сообщения: 1858
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

Можно внедрить собственный механизм кеша, обращение к элементу файла выполняется через функцию. В ней и будет проверятся находится ли этот участок в памяти или на диске - это значительно ускорит операции обмена в файле. Важную роль имеет также метод сортировки, а можно ничего и не делать - сортровать так же как в обычном массиве в памяти - кэш у винды бааальшой...
It's a long way to the top if you wanna rock'n'roll
Аватара пользователя
Oleg_Rus
Сообщения: 335
Зарегистрирован: 16 окт 2006, 09:56
Откуда: г.Улан-Удэ, респ.Бурятия, Российская Федерация
Контактная информация:

а кто-нить фрагмент кода смогет закинуть?

somewhere, а как внедрить этот самый механизм?

MOTOCoder, я вот именно что не могу придумать как сортировать в самом файле, а кол-во записей неограничено.

airyashov, эт ты про какой индекс? поясни, пжл
e-mail: garmayev@yandex.ru
---------------------------------------------------------------------------
<a href="http://nick-name.ru/sertificates/711965/"><img src="http://nick-name.ru/img.php?nick=Garmay ... =2&text=t5" alt="Никнейм Garmayev зарегистрирован!" /></a>
Serge_Bliznykov
Сообщения: 375
Зарегистрирован: 31 авг 2007, 03:06

Oleg_Rus, прежде всего - это задача реальная (будет практически использоваться) или учебная?
Дальше - "а кол-во записей неограничено." - так не бывает. Даже мощные СУБД имеют ограничения, а что уже говорить про просто типизированный файл ;-)
Как минимум количество Ваших записей ограничено файловой структурой... (правда, надо признать, что там цифры количества записей могут быть очень большими... :-)

Дальше, если программа сортировки будет работать два часа (время это я от фонаря сказал, просьба не ловить на слове... ;) - Вас это устроит?
тогда Вы можете обратиться к любым записям файла напрямую - сравнить их, и поменять местами:
seek(MyFile,i); {перешли на i-ю запись}
Read(MyFile,X); {прочитали запись в X}
seek(MyFile,j); {перешли на j-ю запись}
Read(MyFile,Y); {прочитали запись в Y}
if X.Pole1 > Y.Pole2 then begin
....

только я бы КРАЙНЕ не рекомендовал так делать (впрочем, попробовать можно ;-))

Если файл реально не помещается в памяти (да, кстати, а на каком языке пишется обработка/сортировка??) - тогда считываем в массив кусок файла, сортируем его и сохраняем во временный файл, следующий кусок - в другой файл и т.д.
в результате получаем наш файл разбитый на N-кусков (отсортированных). Дальше сливаем эти файлы попарно... Помнится что то подобное я видел у Кнута... вроде бы это называется внешняя сортировка.. или сортировка слиянием...

Т.е. задачу точно можно решить. :-)
Serge_Bliznykov
Сообщения: 375
Зарегистрирован: 31 авг 2007, 03:06

&quot писал(а):А у нас это чуть ли не в каждой курсовой.
в курсовой??? Так это всё таки учёбная задача?? тогда вводим ограничение на количество записей равное количеству записей, помещающихся в память (даже на DOS Паскаль это (65000 / размер одной записи)) и не заморачиваемся ;-))
atavin-ta
Сообщения: 585
Зарегистрирован: 30 янв 2009, 06:38

&quot писал(а):чуть ли не в каждой курсовой.

в курсовой??? Так это всё таки учёбная задача?? тогда вводим ограничение на количество записей равное количеству записей, помещающихся в память (даже на DOS Паскаль это (65000 / размер одной записи)) и не заморачиваемся ;-)
Нельзя. Если сказано, что число записей не ограничено, то это означает, что ограничения всётаки есть, но они все неявные и основные из них происходят из файловой системы. А при сортировке слияниме придётся ещё сортировать сливаемые фрагменты. И почемы 65000/размер одной записи? Тогда уж хотя-бы 65536/размер одной записи.
Вопрос: "Почему вы все сионисты? Нельзя ли писать на чём то другом?".
Ответ: "Писать можно на чём угодно. Но зачем же так себя ограничивать? Пиши на С!".
Ответить