quicksort w stringgrid

0

Witam. Mam wylosowac a nastepnie posortowac stringgrida za pomoca sortowania szybkiego. z losowaniem liczb wiekszych problemow nie mialem jednak nie mam pojecia jak zabrac sie za quicksort liczb w poszczegolnych polach stringgrida. jesli ktos bylby w stanie mi pomoc ( naprowadzic na sposob lub napisac przyklad kodu) bylbym bardzo wdzieczny. ponizej to co napisalem do tej pory ( losowanie). po nacisnieciu drugiego przycisku (button2) w stringgridzie (o nazwie dane) liczby maja byc sortowane quicksortem:

 unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Dane: TStringGrid;
    Button1: TButton;
    Button2: TButton;
    wynik: TStringGrid;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
   


  private
    { Private declarations }
  public
    { Public declarations }
  end;



 

var
  Form1: TForm1;



implementation

{$R *.dfm}




procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer ;

begin
randomize;

for i:=0 to Dane.ColCount-1 do
Dane.Cells[i,0]:= IntToStr(random(100));
end;



end.



0

najpierw wylosuj sobie liczby do zwykłej tablicy, posortuj i przepisz do stringgrida

0

Ile z tego kodu napisał Ci kompilator...

0

Jabrzoza dzieki za podpowiedz. wiec mam cos takiego:

                                           unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Dane: TStringGrid;
    Button1: TButton;
    Button2: TButton;
    wynik: TStringGrid;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);





  private
    { Private declarations }
  public
    { Public declarations }
  end;





var
  Form1: TForm1;
  tablica:array [1..6] of integer;


implementation

{$R *.dfm}




procedure TForm1.Button1Click(Sender: TObject);
var i:integer ;

begin
randomize;

for i:=0 to Dane.ColCount-1 do
 begin
  tablica[i]:=random(100);
  dane.Cells[i,0]:=IntToStr(tablica[i]);
 end;
end;


procedure Sortuj_szybko(lewy, prawy : integer);
var
  i,j,piwot,x : integer;
begin
  i := (lewy + prawy) div 2;
  piwot := tablica[i];
  tablica[i] := tablica[prawy];
  j := lewy;
  for i := lewy to prawy - 1 do
    if tablica[i] < piwot then
    begin
      x := tablica[i];
      tablica[i] := tablica[j];
      tablica[j] := x;
      inc(j);
    end;
  tablica[prawy] := tablica[j];
  tablica[j] := piwot;
  if lewy < j - 1  then Sortuj_szybko(lewy, j - 1);
  if j + 1 < prawy then Sortuj_szybko(j + 1, prawy);

end;




end.

jak w procedurze Sortuj_szybko wywołac stringgrida? jesli probuje go napisac wyrzuca blad ze nie jest zdefiniowany. Mozna procedure sortuj_szybko wrzucic do innej -> button2click?? bo nie wiem jak wyswietlic teraz losowane dane.

0

MainForm.StringGrid

0
bartek87 napisał(a)

jak w procedurze Sortuj_szybko wywołac stringgrida?

jak masz zadeklarowaną osobną tablicę to możesz skorzystać z gotowej procedury sortuj_szybko bez odwoływania się w niej do stringgrida. dopiero po wykonaniu sortowania wrzuć uzyskaną zawartość tablicy tablica do stringgrida.

a jeśli chcesz koniecznie sortować w stringgridzie to musisz zmodyfikować proc. sortuj_szybko. w miejscach gdzie w procedurze występują porównania zamiast tablica[i] użyj cells[i,0] konwerując to na liczbę

0

zrobilem to nie zamieniajac stringrida z tablica. po prostu po kliknieciu na przycisk sortu (button2) do drugiego stringgrida (wynik) wczytuje posortowana tablice. jednak nie dziala to zgodnie z moim pomyslem. wyskakuje blad "Staclk Overflow". sprawdzcie dzie robie blad.
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Dane: TStringGrid;
Button1: TButton;
Button2: TButton;
wynik: TStringGrid;
Label1: TLabel;
Label2: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
tablica:array [1..6] of integer;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i:integer ;

begin
randomize;

for i:=0 to Dane.ColCount-1 do
begin
tablica[i]:=random(100);
dane.Cells[i,0]:=IntToStr(tablica[i]);
end;
end;

procedure Sortuj_szybko(lewy, prawy : integer);
var
i,j,piwot,x : integer;
begin
lewy:=0;
prawy:=6;
i := (lewy + prawy) div 2;
piwot := tablica[i];
tablica[i] := tablica[prawy];
j := lewy;
for i := lewy to prawy - 1 do
if tablica[i] < piwot then
begin
x := tablica[i];
tablica[i] := tablica[j];
tablica[j] := x;
inc(j);
end;
tablica[prawy] := tablica[j];
tablica[j] := piwot;
if lewy < j - 1 then Sortuj_szybko(lewy, j - 1);
if j + 1 < prawy then Sortuj_szybko(j + 1, prawy);

end;

procedure TForm1.Button2Click(Sender: TObject);
var i,lewy,prawy:integer;
begin

Sortuj_szybko(lewy,prawy);

for i:=0 to Dane.ColCount-1 do
begin
tablica[i]:=random(100);
wynik.Cells[i,0]:=IntToStr(tablica[i]);
end;

end;

end.


apropo googli to szukalem i jedyne co znalazlem to quickosrt w delphi konsolowym lub pascalu co mi tylko ulatwilo sprawe. dlatego pisze tutaj i prosze o pomoc.
0
procedure Sortuj_szybko(lewy, prawy : integer);
var
  i,j,piwot,x : integer;
begin
  lewy:=0;
  prawy:=6;
  (...)
end;

podstawiając lewy prawy niszczysz przekazane parametry. w efekcie procedura wywołuje się rekurencyjnie aż do przepełnienia stosu

0

jaBrzoza wielkie dzieki za pomoc. program skonczony i ladnie smiga. zastosowalem zmiany na podstawie quicksorta tablicy z tego forum i to przynioslo skutek:) ponizej dzialajacy program:

                                           unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Dane: TStringGrid;
    Button1: TButton;
    Button2: TButton;
    wynik: TStringGrid;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  





  private
    { Private declarations }
  public
    { Public declarations }
  end;





var
  Form1: TForm1;
  tablica:array [0..5] of integer;


implementation

{$R *.dfm}




procedure TForm1.Button1Click(Sender: TObject);
var i:integer ;

begin
randomize;

for i:=0 to Dane.ColCount-1 do
 begin
  tablica[i]:=random(100);
  dane.Cells[i,0]:=IntToStr(tablica[i]);
 end;
end;


procedure Sort(var iArray: array of Integer);

  procedure QuickSort(iLow, iHigh : Integer);
  var
    iLo, iHi : Integer;
    x, Temp : Integer;
  begin

    iLo := iLow;
    iHi := iHigh;

    X := iArray[(iLow + iHigh) div 2];
    repeat

      while iArray[iLo] < X do Inc(iLo);

      while iArray[iHi] > X do Dec(iHi);

      if (iLo <= iHi) then

      begin
        Temp := iArray[iLo];
        iArray[iLo] := iArray[iHi];
        iArray[iHi] := Temp;

        Inc(iLo);
        Dec(iHi);
      end;

    until iLo > iHi;

    if (iHi > iLow) then QuickSort(iLow, iHi);

    if (iLo < iHigh) then QuickSort(iLo, iHigh);
  end;

begin
  QuickSort(Low(iArray), High(iArray));
end;



procedure TForm1.Button2Click(Sender: TObject);
 var i,lewy,prawy:integer;
begin



for i:=0 to Dane.ColCount-1 do
 begin
  Sort(tablica);
  wynik.Cells[i,0]:=IntToStr(tablica[i]);
 end;

end;

end.

1 użytkowników online, w tym zalogowanych: 0, gości: 1