Помощь - Поиск - Пользователи - Календарь
Полная версия: сортировка строк
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Гость_annie
я вот такую прогу написала, кот должна выдавать в алф. порядке слова из файла. она выдает последнее слово н раз. что тут не так?
можно ли использовать метод пузырька для сортировки массива из строк?
вот у меня такая прога:
Код
program blah;
uses crt;
type
r=1..500;
mas=array[r] of string[10];
var  i,k,l:integer;
    m,n:r;
    sp:mas;
    slovar:text;
    p,tmp:string;
begin
clrscr;
assign(slovar,'slovar.txt');
reset(slovar);
n:=1;
while not eof(slovar) do
begin readln(slovar,p);
n:=n+1;
{for i:=1 to length(p) do
begin }
for m:=1 to n-1
do begin sp[m]:=p;
{end;}
end;
writeln(m,'  ',sp[m]);
for m:=n-1 downto 2 do
for l:=1 to m-1 do
if sp[l]>sp[l+1] then
begin
tmp:=sp[l];
sp[l]:=sp[l+1];
sp[l+1]:=tmp;
end;
end;
writeln('v alfavitnom poryadke:');
for l:=1 to n-1 do
writeln(l,'   ',sp[l]);
writeln(n-1);
close(slovar);
readkey;
writeln('Programma zavershila rabotu.');
end.



она выдаёт последнее слово в файле, приравнивая его всем эл-там массива. почему так?
в файле словарь.тхт даны строки типа
Код
HELLO
MY
NAME
IS
KATE
на выходе:
1   HELLO
2   MY
3   NAME
4   IS
5   KATE
'v alfavitnom poryadke:
1   KATE
2   KATE
3   KATE
4   KATE
5   KATE
volvo
Попробуй так:

program blah;
uses crt;
type
r=1..500;
mas=array[r] of string[10];
var i,k,l:integer;
m,n:r;
sp:mas;
slovar:text;
p,tmp:string;
begin
clrscr;
assign(slovar,'slovar.txt');
reset(slovar);
n:=1;
while not eof(slovar) do
begin readln(slovar,sp[n]);
writeln(n,' ',sp[n]);
n:=n+1;
for m:=n-1 downto 2 do
for l:=1 to m-1 do
if sp[l]>sp[l+1] then
begin
tmp:=sp[l];
sp[l]:=sp[l+1];
sp[l+1]:=tmp;
end;
end;
writeln('v alfavitnom poryadke:');
for l:=1 to n-1 do
writeln(l,' ',sp[l]);
writeln(n-1);
close(slovar);
readkey;
writeln('Programma zavershila rabotu.');
end.

Altair
Цитата
слова из файла

Каждое слово на отдельной строке?
Цитата
можно ли использовать метод пузырька для сортировки массива из строк?

Да конечно, но при сравнении строк действует правило:
сначала сравнивается длинна строки, и если равны строки то уже по алфавиту...
APAL
Цитата
сначала сравнивается длинна строки, и если равны строки то уже по алфавиту...

Только что проверил в TP7 - ничего подобного, сразу по алфавиту.

Цитата
If 'abcd'>'bc' then Writeln('Ok') else Writeln('No');
Altair
Да, действительно... странно, я думал иначе... rolleyes.gif
тогда нет проблемм...
;)
Гость_annie
спасибо огромное за проверку
smile.gif)))))))
Да, в файле 1 слово на строку, но теперь уже всё ясно.
всем спасибо
Altair
Конечно, что тут не понятного, если код привели рабочий smile.gif
volvo
Oleg_Z
Я только подправил код :p2:

Все равно smile.gif
Гость
Тема конечно старая, но мало ли еще кто догадается отсортировать строки пузырем. =)

Конечно, теоретически отсортировать можно. Но представьте реальную программу, в которой будет использоваться пузырь! Мало того, что он малопригоден для сортировки обычных чисел - квадратичная сложность обрекает ваш компьютер на глубокие раздумья уже при количестве элементов 10000.

А для еще большего количества строк непригоден даже qsort (быстрая сортировка, сложность n*log(n)). У меня сейчас стоит подобная задача - отсортировать 100000 строк длиной 15 за быстрое время. Сейчас работаю в направлении поразрядной сортировки (RadixSort, по-идее работает за линейное время).

Так что не вздумайте сортировать строки пузырем!

alext
volvo
Цитата
Так что не вздумайте сортировать строки пузырем!
У тебя спрашивали, что-ли, как сортировать? Когда спросят, тогда будешь высказываться. О космических скоростях и галактических размерах в данной теме речь не шла.

Теоретиков, которые все время только работают в направлении, но у них всегда только теоретические высказывания (причем чаще всего - это набор слов) в последнее время толпы развелись... Экзамены закончились, что-ли? Теперь до сентября будут заумные ничего не значащие высказывания? dry.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.