Отправляет email-рассылки с помощью сервиса Sendsay

[prg] метод пузырька- алгоритм сортировки массива

Здравствуйте всем участникам рассылки! На delphi нужно написать программу,
которая сортировала бы динамический строковый массив методом пузырька. Так,
сама по себе задача несложная, но я, к сожалению, забыл этот алгоритм
сортировки. Скажите пожалуйста, где можно о нём почитать или найти пример
применения. Заранее спасибо всем откликнувшимся. С уважением Леонид.

Ответить   Thu, 29 Mar 2012 21:31:30 +0600 (#2417424)

 

Ответы:

Привет.
29.03.2012 22:31, леонид написал:

http://algolist.manual.ru/sort/bubble_sort.php
Пример, правда, на си.

Ответить   Fri, 30 Mar 2012 07:53:55 +0700 (#2417813)

 

Здравствуйте, леонид.

Вы писали 29 марта 2012 г., 21:31:30:

Есть один оч. клёвый сайт, всем хотьбы даже и потенциальным
программерам надо обязательно о нем знать:
google.ru

Ответить   Sat, 31 Mar 2012 01:07:10 +0600 (#2418880)

 

здравствуйте. там примерно так.. циклически проходим массив меняя две
соседние ячейки по содержимому местами согласно условию сравнения.
тоесть если например ячейка один меньше чем ячейка 2 , то меняем
содержимое.. так проходим весь массив. сортировка заканчивается только
тогда, когда все условия выполнены и например флаг переменная равна
лжи. тоесть не было рокировки. метод медленный , но устойчивый. что
означает - когда массив уже отсортированый скармливается снова этому
методу, то он заканчивается мгновенно. так как он уже отсортирован.
рекомендую метод с добавлением. тот же пузырек, только записи
добавляются в конец массива и всплывают вверх. это работает быстрее.
самый простой , но не устойчивый, но также очень крутой метод -
бинарный. есть методы с дополнительным массивом и с одним. метод не
знает что массив может быть уже отсортирован и будет заново
сортировать содержимое.. но он очень быстр.

Ответить   Sat, 31 Mar 2012 00:26:30 +0300 (#2418942)

 

Здравствуйте, Константин <galiahmet***@r*****.ru>.

-----------------------*- Original Message -*> Есть один оч. клёвый сайт, всем хотьбы даже и потенциальным

[+] -- Неинформативность.

Всем, хотьбы и потенциальным подписчикам, надо знать одно клевое
правило: если Вам нечего сказать по существу заданного вопроса, то
вполне допустимо просто промолчать. Мир от этого не рухнет.

Ответить   Sat, 31 Mar 2012 14:37:06 +0400 (#2419418)

 

вот мой пузырек , даже разложеный на этапы. из проги сортировщика для
макс ридера. for delphi: (извиняйте за полный код. лень вырезать)
сортирует статьи от большего к меньшему по длине и обратному алфавиту.
возможно переделать и улучшить на свой вкус. unit d_sort;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, mmsystem;

type
TForm1 = class(TForm)
OpenDialog1: TOpenDialog;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

precount_st, count_st: integer;
implementation

{$R *.DFM}

procedure sort(fdName_m: string);
var
b, change, w, q, p:integer;
lng, s1, s2: string;
fd: TextFile; // файл string
buf: String;
sort: array of AnsiString;
size_sort: integer;

begin

// вычисляем максимальный размер массива
size_sort:= 0; // размер массива
precount_st:= 0;

AssignFile(fd, fdName_m); {$I+}
Reset(fd); // открыть для чтения {$I+}
while not EOF (fd) do begin
readln(fd, buf); // прочитать строку из файла
size_sort:= size_sort + 1; // накапливаем размерность
// подсчитываем общее количество статей до обработки
b:= pos('=', buf);
if b<> 0 then precount_st:= precount_st + 1;
end; // while
CloseFile(fd);

// устанавливаем максимальный размер массива
SetLength(sort, size_sort + 1); // устанавливаем размер массива
// q:= 0;

// открываем файл словаря max reader
AssignFile(fd, fdName_m); {$I+}
Reset(fd); // открыть для чтения {$I+}

while not EOF (fd) do begin
q:= q + 1;
readln(fd, buf); // прочитать строку из файла
//buf:= AnsiLowerCase(buf); // преобразовываем строку к нижнему регистру
sort[q]:= buf; // помещаем строку в массив
end; // while
CloseFile(fd);

//// маркируем, если не статья
for q:= 1 to size_sort do begin
b:= pos('=', sort[q]);
if b= 0 then sort[q]:= '@=@';
end; // for. маркируем

// удаление лишних пробелов
for q:= 1 to size_sort do begin
repeat
b:= pos(' ', sort[q]); delete(sort[q], b, 1);
until b= 0;
end; // for. удаление лишних пробелов

// индексируем правила
for q:= 1 to size_sort do begin

// ищем позицию знака равно
b:= pos('=', sort[q]);
// отделяем статью - что
s1:= Copy(sort[q], 1, b-1);
// присваеваем правила
b:= length(s1); // крайний правый символ
lng:= IntToStr(b);
// подставляем нули
if length(lng)= 1 then lng:= '00' + lng;
if length(lng)= 2 then lng:= '0' + lng;

if (s1[1]= ' ') And (s1[b]= ' ') then
sort[q]:= lng + ':1:' + sort[q];

if (s1[1]= ' ') And (s1[b]<> ' ') then
sort[q]:= lng + ':2:' + sort[q];

if (s1[1]<> ' ') And (s1[b]= ' ') then
sort[q]:= lng + ':3:' + sort[q];

if (s1[1]<> ' ') And (s1[b]<> ' ') then
sort[q]:= lng + ':4:' + sort[q];
end; //for

// сортировка массива
w:= 0;
repeat
change:= 0;
for q:= 1 to size_sort-1 do begin
s1:= sort[q]; s2:= sort[q+1];

// [1] ищем позицию знака равно
b:= pos('=', s1);
// отделяем статью - что
s1:= Copy(s1, 1, b-1);

// [2] ищем позицию знака равно
b:= pos('=', s2);
// отделяем статью - что
s2:= Copy(s2, 1, b-1);

// сравнение
p:= AnsiCompareStr(s1, s2);

if p< 0 then begin
change:= 1;
sort[0]:= sort[q];
sort[q]:= sort[q+1];
sort[q+1]:= sort[0];
end; // begin
end; // for
// звуковая индикация
w:= w + 1; // подсчитываем статьи
if w= 5 then w:= 0;
if w= 0 then PlaySound('done_st.wav',0,SND_ASYNC);
until change= 0;

// удаляем правила
for q:= 1 to size_sort do
delete(sort[q], 1, 6);

// удаляем повторения
for q:= 1 to size_sort-1 do begin
s1:= sort[q]; s2:= sort[q+1];

// [1] ищем позицию знака равно
b:= pos('=', s1);
// отделяем статью - что
s1:= Copy(s1, 1, b-1);

// [2] ищем позицию знака равно
b:= pos('=', s2);
// отделяем статью - что
s2:= Copy(s2, 1, b-1);

if s1 = s2 then
sort[q]:= '@=@';

end; // for

// записываем массив в файл
count_st:= 0;
AssignFile(fd, fdName_m);
Rewrite(fd);

for q:= 1 to size_sort do
if (sort[q] <> '') And (sort[q]<> '@=@') then begin
writeln(fd, sort[q]); // записать строкуу в файл
count_st:= count_st + 1; // статистика полезных статей
end; // запись
CloseFile(fd);

MessageBeep(MB_ICONASTERISK); // *
end; // procedure sort

procedure TForm1.FormCreate(Sender: TObject);
var
fdName_m: string;
b, q, e : integer;
begin

OpenDialog1.Title:= 'Сортировка: Укажите путь к словарю произношений Max-Reader';

repeat
e:= 0;

if OpenDialog1.Execute then begin
e:= 1;
fdName_m:= OpenDialog1.FileName;
// проверяем правильность идентификации словаря
B:= pos('\settings\dictionary.txt', fdName_m);
if b <> 0 then begin
// проверяем наличие словаря как файла
if FileExists(fdName_m) = False then begin
MessageBeep(MB_ICONHAND);//ошибка

halt;
end; // наличие словаря

PlaySound('mess.wav',0,SND_SYNC);
sort(fdName_m); // сортируем

PlaySound('complete.wav',0,SND_SYNC);

ShowMessage('Операция завершена' + chr(13)
+ 'Общее количество статей:' + chr(13)
+ 'до сортировки ' + IntToStr(precount_st) + chr(13)
+ 'после сортировки ' + IntToStr(count_st));

end; //begin. b

end; // begin. opendialog1
until (b<> 0) Or (e= 0);
Form1.Hide;
halt;
end; // create form

end.
24 января 2010

Ответить   Sat, 31 Mar 2012 00:45:18 +0300 (#2418945)