Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Delphi]Быстрая сортировка(сортировка Хоара)


Автор: NaG1 24.6.2011, 20:48
Всем здраствуйте
у меня возникла серьезная проблема с кодом:

вот часть кода, где сейчас у меня выбиваются ошибки:

Код

unit Unit3;

interface

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

type
  TForm3 = class(TForm)
    strngrd2: TStringGrid;
    BitBtn1: TBitBtn;
    btn1: TBitBtn;
    edt1: TEdit;
    edt2: TEdit;
    procedure BitBtn1Click(Sender: TObject);
    procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form3: TForm3;
   min,z,c:integer;
   e, d, i, Nmin, j, k: byte;
implementation

uses
  Unit1, Unit2;

{$R *.dfm}

procedure TForm3.BitBtn1Click(Sender: TObject);
begin
close;
end;


procedure TForm3.btn1Click(Sender: TObject);
const b = strtoint(edt1.Text);{пока проблема в этой строке}
var
A:array[1..b] of integer;
begin
c:=strtoint(edt2.Text);
z:=1;
with Form1 do
begin
for i:=1 to Strngrd1.ColCount do
    for j:=1 to Strngrd1.RowCount do
      if TryStrToInt(Strngrd1.Cells[i, j], z) then
        a[i]:=StrToInt(Strngrd1.Cells[i,1]);
for i:=1 to b do
        a[i]:=StrToInt(Strngrd1.Cells[i,1]);
for i:=1 to b do
        Strngrd2.Cells[i,0]:=IntToStr(i);
for i:=1 to b-1 do
        Strngrd2.Cells[0,i]:=IntToStr(i);
        {Çäåñü ñîðòèðîâêà}
for i:=1 to b-1 do
        begin
                min:=a[i];     
                Nmin:=i;
                for j:=i+1 to b do
                        begin
                                if a[j]<min then
                                        begin
                                                min:=a[j]; 
                                                Nmin:=j;     
                                                a[Nmin]:=a[i];
                                                a[i]:=min;
                                        end;
                        for k:=1 to b do
                                Strngrd2.Cells[k,i]:=IntToStr(a[k]);
                        end;
        end;
end;
for i:=1 to b do
Strngrd2.Cells[i,1]:=IntToStr(a[i]);
end;

end.


Суть программы в том, что она создает массивы(одномерные и двумерные) - это у меня получилось без проблем,
но вот то, что массив нужно отсортировать методом Хоара - это уже проблема, над которой бьюсь уже неделю.....

Тему создал в Делфи для новичков, но так как никто не ответил, то создал ее в тут.

Помогите с кодом пожалуйста! А то на допиливание программы осталось 2 дня и защита..... smile 

исходник программы:

Автор: NaG1 24.6.2011, 22:40
Keeper89
Это как ты так в константу решил значение из Эдита загнать?

Добавлено @ 22:07
Если хочется сделать массив определенной размерности - либо используй динамические, либо ставь b=10, а итерации делай уже по какой-нибудь n<10.


я знаю что не правильно, но все дело в том что плз сам вводит размерность массива, а если указывать
Код

A:array of integer;


вместо
Код

A:array[1..b] of integer;


все время ошибку выдает при сортировке.

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

Автор: NaG1 25.6.2011, 10:59
Язык написания - Delphi(Ведь только там есть StringGrid,?)

небольшое изменение в коде от ошибок не спасло
Код

procedure btn1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
var
  Form3: TForm3;
   min,z,c:integer;
   e, d, i, Nmin, j, k: byte;
   b:Integer;
implementation

uses
  Unit1, Unit2;

{$R *.dfm}

procedure TForm3.BitBtn1Click(Sender: TObject);
begin
close;
end;


procedure TForm3.btn1Click(Sender: TObject);
var
A:array of integer;
begin
c:=strtoint(edt2.Text);
b:=strtoint(edt1.Text);
z:=1;
SetLength(A, b);
with Form1 do
begin
for i:=0 to Strngrd1.ColCount do
    for j:=0 to Strngrd1.RowCount do
      if TryStrToInt(Strngrd1.Cells[i, j], z) then
        a[i]:=StrToInt(Strngrd1.Cells[i,1]);
for i:=0 to b do
        a[i]:=StrToInt(Strngrd1.Cells[i,1]);
for i:=0 to b do
        Strngrd2.Cells[i,0]:=IntToStr(i);
for i:=0 to b-1 do
        Strngrd2.Cells[0,i]:=IntToStr(i);
        {Çäåñü ñîðòèðîâêà}
for i:=0 to b-1 do
        begin
                min:=a[i];     
                Nmin:=i;
                for j:=i+1 to b do
                        begin
                                if a[j]<min then
                                        begin
                                                min:=a[j]; 
                                                Nmin:=j;     
                                                a[Nmin]:=a[i];
                                                a[i]:=min;
                                        end;
                        for k:=0 to b do
                                Strngrd2.Cells[k,i]:=IntToStr(a[k]);
                        end;
        end;
end;
with Form1 do
for i:=0 to b do
Strngrd1.Cells[i,1]:=IntToStr(a[i]);
end;

end.

http://s1.ipicture.ru/
http://s1.ipicture.ru/


Автор: Wedafl 13.7.2011, 23:52
Нормальный пример того как оно должно быть.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)