Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 08.05.2011, 18:21
k1ng_k0ng k1ng_k0ng вне форума
Прохожий
 
Регистрация: 08.05.2011
Сообщения: 6
Репутация: 10
Восклицание Реализация сортировки включением (вставками) и Прочесыванием. (Помогите, виснет)

Доброго времени суток, господа!
Такая проблемка нужно реализовать 2 метода сортировки чтоб результаты выводились в стрнггрид а в лейблы выводилсь количество перестановок для сровнения.
Я зделал генерацию и открытие файла содержащего масив а с сортировкой проблемка, подскажите пожалуйста.
Виснет после нажатия кнопки метода включением.

Код:
unit Grishman1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls, StdCtrls, Grids;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Label1: TLabel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Label2: TLabel;
    Label3: TLabel;
    StringGrid2: TStringGrid;
    Bevel1: TBevel;
    Label4: TLabel;
    StringGrid3: TStringGrid;
    OpenDialog1: TOpenDialog;
    SaveDialog1: TSaveDialog;
    Button5: TButton;
    procedure Button5Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure vkluch(var a: array of integer;n:integer);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
const
n=1000;
var
  Form1: TForm1;
  f:textfile;
  a:array[1..n] of integer;
  i:integer;
  S:string;

implementation

{$R *.dfm}
procedure tform1.vkluch(var a: array of integer;n:integer);
var
j,i,cv,mv:integer;
f:textfile;
B: array [0..10000] of integer;
begin
if OpenDialog1.Execute then begin
assignfile(f,opendialog1.FileName);
reset(f);
i:=1;
while not eof(f) do begin
for i:=0 to n do begin
j:=i;
cv:=0;
mv:=0;
while (j>1) and (B[j-1]>A[i]) do begin
B[j]:=B[j-1];
j:=j-1;
end;
B[j]:=A[i];
end;
for i:=0 to N do begin
A[i]:=b[i];
stringgrid2.cells[i,0]:=inttostr(a[i]);
end;
end;
end;
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
stringgrid1.colcount:=n+1;

if savedialog1.execute then
  begin
  assignfile(f,savedialog1.filename);
  rewrite(f);

  randomize;
  for i:=1 to n do begin
   a[i]:=random(1000)-500;

  writeln(f,a[i]);
  end; end;
  closefile(f);
  end;


procedure TForm1.Button1Click(Sender: TObject);
begin
stringgrid1.colcount:=n+1;
stringgrid1.rowcount:=0;
  if opendialog1.Execute then begin
  assignfile(f,opendialog1.FileName);
  for i:=1 to n do begin
  stringgrid1.cells[i,0]:=inttostr(a[i]);
  reset(f);
end;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
stringgrid2.colcount:=n+1;
stringgrid2.rowcount:=0;
vkluch(a,n);

end;

end.

Изначально код был другим (процедура включ) но все равно не работало
Обясните пожалуйста как реализовать ети методы в интернете куча примеров но я немогу понять как оно работает
Ответить с цитированием
  #2  
Старый 09.05.2011, 12:14
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Код:
stringgrid1.rowcount:=0;
stringgrid2.rowcount:=0;
Какое-то странное уничтожение таблицы.

Хотя я посмотрел - один ряд остаётся, видимо, можно писать: ":= 1";

Последний раз редактировалось AlexSku, 09.05.2011 в 12:20.
Ответить с цитированием
  #3  
Старый 09.05.2011, 12:36
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

А в коде очень много странных вещей:
в процедуре vkluch
1). открывается файл f для чтения (reset(f)), затем идёт цикл (while not eof(f)), но в этом цикле я не увидел ни одного чтения. Это, кстати, наверняка и причина зацикленности (зависания).

2) внутри цикла сравниваются массивы "B" и "A" (while (j>1) and (B[j-1]>A[i])). Во-первых, массив B локальный, не инициализирован и, значит, содержит мусор. Почему вы пишите то "a", то "A" (и для "B" тоже)? Для Delphi это всё равно, но вы уверены, что это тот же массив. Почему у одного массива длина 1.000, а у другого 10.000?
Ответить с цитированием
  #4  
Старый 09.05.2011, 14:03
k1ng_k0ng k1ng_k0ng вне форума
Прохожий
 
Регистрация: 08.05.2011
Сообщения: 6
Репутация: 10
По умолчанию

ну вот, я делаю по примерам, пример процедуры сортировки взял в интернете)) я просто не понимаю сам алгоритм как оно сортирует, с цыклами буду розбиратся спасибо !
Ответить с цитированием
  #5  
Старый 09.05.2011, 21:04
AlexSku AlexSku вне форума
Специалист
 
Регистрация: 07.05.2007
Адрес: Москва
Сообщения: 884
Репутация: 21699
По умолчанию

Вот алгоритм метода из Википедии:
Код:
Вход: массив A, состоящий из элементов A[1], A[2], ..., A[n]

for i = 2, 3, ..., n:  
    key := A[i]
    j := i - 1
    while j > 0 and A[j] > key:
        A[j + 1] := A[j]
        j := j - 1
    A[j + 1] := key
Идея такая. Берётся первый элемент (А1). Затем находится место для элемента А2 (перед А1 или после), затем - для А3 (в начале, в середине или в конце) и так далее. Как находится место для нового элемента, если К элементов уже находятся по порядку (возрастания)? Начиная с последнего (К-го) элементы сдвигаются вперёд (их индекс увеличивается), пока не выполнится условие, что в образовавшуюся дыру можно вставить (К+1)-й элемент (он обозначен key), так чтобы он был на месте, т.е. он был больше соседей с меньшими индексами, но меньше соседей с большими индексами.
Хотя не знаю, для чего вам дают этот метод, ведь он не самый быстрый. Наверное, для вас других заданий не могут придумать.
Ответить с цитированием
  #6  
Старый 10.05.2011, 18:53
k1ng_k0ng k1ng_k0ng вне форума
Прохожий
 
Регистрация: 08.05.2011
Сообщения: 6
Репутация: 10
Хорошо

Вот код процедуры сортировки вставками который нам дали на лекции
с етим програма не виснет спасибо за помощь! но все равно как то криво сортирует))
Код:
procedure tform1.vkluch(n:integer);
var
j,b,i,cv,mv:integer;
f:textfile;

begin
if OpenDialog1.Execute then begin
assignfile(f,opendialog1.FileName);
reset(f);
i:=1;
while not eof(f) do begin
readln(f,a[i]);
i:=2;
cv:=0;
mv:=0;
if i<=n then begin
for j:=1 to n do begin
cv:=cv+1;
if a[j]>a[i] then begin
b:=a[i];
a[i]:=a[j];
a[j]:=b;
mv:=mv+1;
i:=i+1;
stringgrid2.cells[i,0]:=inttostr(a[j]);
cv, mv - ето количество сравниваний и перестановок (для сравнения с другим методом)
теперь буду розбиратся с 2 методом
Ответить с цитированием
  #7  
Старый 10.05.2011, 20:01
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,723
Репутация: 52347
По умолчанию

Посмотрите что в примере:
Код:
while not eof(f) do begin
readln(f,a[i]);
и что у вас.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #8  
Старый 11.05.2011, 23:36
k1ng_k0ng k1ng_k0ng вне форума
Прохожий
 
Регистрация: 08.05.2011
Сообщения: 6
Репутация: 10
По умолчанию

вы меня озадачили. я не понял вопрос.
в каком примере?
Ответить с цитированием
  #9  
Старый 24.05.2011, 20:04
k1ng_k0ng k1ng_k0ng вне форума
Прохожий
 
Регистрация: 08.05.2011
Сообщения: 6
Репутация: 10
По умолчанию

итак финальный код включения (работает)
Код:
procedure tform1.vkluch(n:integer);
var
j,b,i,cv,mv:integer;
f:textfile;

begin
n:=strtoint(Edit1.Text);
if OpenDialog1.Execute then begin
assignfile(f,opendialog1.FileName);
reset(f);
i:=1;
while not eof(f) do begin
readln(f,a[i]);
i:=i+1;
end;
n:=i-1;
i:=2;
cv:=0;
mv:=0;
j:=j-1;
while i<=n do begin
//for j:=i-1 downto 2 do begin
cv:=cv+1;
j:=i;
while (a[j]<a[j-1])and(j>1) do begin
b:=a[j-1];
a[j-1]:=a[j];
a[j]:=b;
mv:=mv+1;
j:=j-1;
end;

i:=i+1;
end;
stringgrid2.ColCount:=n+1;
for i:=1 to n do
stringgrid2.cells[i-1,0]:=inttostr(a[i]);

end;
end;
Ответить с цитированием
  #10  
Старый 24.05.2011, 20:05
k1ng_k0ng k1ng_k0ng вне форума
Прохожий
 
Регистрация: 08.05.2011
Сообщения: 6
Репутация: 10
По умолчанию

Обьясните, ето метод прочесывание? и почему он не работает?)
Код:
procedure tform1.pr(n:integer);
const
t=6;
var
j,i,k,q:integer;
m:1..t;
h:array [1..t] of integer;
f:textfile;
begin
if OpenDialog1.Execute then begin
assignfile(f,opendialog1.FileName);
reset(f);
i:=1;
while not eof(f) do begin
readln(f,a[i]);
i:=i+1;
end;
h[1]:=8; h[2]:=6; h[3]:=4; h[4]:=3; h[5]:=2; h[6]:=1;
for m:=1 to t do
begin k:=h[m]; q:=-k;
if q=0 then q:=-k; q:=q+1; a[q]:=a[i];
while a[i]<a[j] do
begin a[j+k]:=a[j]; j:=j-k;
end;
a[j+k]:=a[i];
end;
stringgrid3.ColCount:=n+1;
for i:=1 to n do
stringgrid3.cells[i-1,0]:=inttostr(a[i]);
end; end;
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:51.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025