Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ сортировка строк

Автор: Гость_annie 18.11.2004 21:59

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

Код
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 18.11.2004 22:09

Попробуй так:


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 18.11.2004 22:12

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

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

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

Автор: APAL 18.11.2004 22:16

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

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

Цитата
If 'abcd'>'bc' then Writeln('Ok') else Writeln('No');

Автор: Altair 18.11.2004 22:24

Да, действительно... странно, я думал иначе... rolleyes.gif
тогда нет проблемм...
;)

Автор: Гость_annie 18.11.2004 22:51

спасибо огромное за проверку
smile.gif)))))))
Да, в файле 1 слово на строку, но теперь уже всё ясно.
всем спасибо

Автор: Altair 18.11.2004 22:56

Конечно, что тут не понятного, если код привели рабочий smile.gif

Автор: volvo 18.11.2004 23:01

Oleg_Z
Я только подправил код :p2:

Все равно smile.gif

Автор: Гость 17.07.2007 2:06

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

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

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

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

alext

Автор: volvo 17.07.2007 3:20

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

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