Страница 1 из 1

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

Добавлено: 04 июл 2008, 07:54
Oleg_Rus
такой вопрос: как отсортировать записи в типизированном файле? много думал над этим вопросом, но ничего не смог придумать... А у нас это чуть ли не в каждой курсовой.

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

Добавлено: 04 июл 2008, 08:19
airyashov
индекс сделать самое простое

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

Добавлено: 04 июл 2008, 14:04
MOTOCoder
Если число записей ограничено по условию, можно записать все в массив, отсортировать его стандартным методом и записать обратно. Если нет - нужно сортировать прямо в файле. Тут, наверное, пойдет стандартный алгоритм сортировки, только придется работать прямо с файлом.

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

Добавлено: 04 июл 2008, 23:37
somewhere
Можно внедрить собственный механизм кеша, обращение к элементу файла выполняется через функцию. В ней и будет проверятся находится ли этот участок в памяти или на диске - это значительно ускорит операции обмена в файле. Важную роль имеет также метод сортировки, а можно ничего и не делать - сортровать так же как в обычном массиве в памяти - кэш у винды бааальшой...

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

Добавлено: 05 июл 2008, 05:09
Oleg_Rus
а кто-нить фрагмент кода смогет закинуть?

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

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

airyashov, эт ты про какой индекс? поясни, пжл

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

Добавлено: 05 июл 2008, 08:18
Serge_Bliznykov
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-кусков (отсортированных). Дальше сливаем эти файлы попарно... Помнится что то подобное я видел у Кнута... вроде бы это называется внешняя сортировка.. или сортировка слиянием...

Т.е. задачу точно можно решить. :-)

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

Добавлено: 05 июл 2008, 08:26
Serge_Bliznykov
&quot писал(а):А у нас это чуть ли не в каждой курсовой.
в курсовой??? Так это всё таки учёбная задача?? тогда вводим ограничение на количество записей равное количеству записей, помещающихся в память (даже на DOS Паскаль это (65000 / размер одной записи)) и не заморачиваемся ;-))

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

Добавлено: 09 фев 2009, 14:24
atavin-ta
&quot писал(а):чуть ли не в каждой курсовой.

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