Avatar billede ruma1974 Nybegynder
24. januar 2004 - 16:09 Der er 6 kommentarer og
1 løsning

Quicksort sortering af reele tal

Hej,

Jeg skal have sorteret nogle reele tal. Jeg har følgende quicksort algorithm fra

http://www.udvikleren.dk/article.php?aid=140&techid=2

Den virker fint. Jeg kan dog ikke få den til at virke på reele  tal.

Er der nogen der kan?


Mvh,

ruma
Avatar billede arne_v Ekspert
24. januar 2004 - 16:13 #1
talarray, midti og tempint skal have anden type, så bør det virke.
Avatar billede ruma1974 Nybegynder
24. januar 2004 - 16:26 #2
Det var også hvad jeg tænkte men jeg var lidt doven og gad ikke at overføre mine tal til et array men dette burde værre det samme

procedure Tform1.QuickSort(iLo, iHi: Integer);
    var
      Lo, Hi: Integer;
      mid:real;
      T:string;
    begin
      Lo := iLo;
      Hi := iHi;
      Mid :=strtofloat(ListBox1.items[(lo+hi) div 2]);
        repeat
        while strtofloat(ListBox1.items[lo])< Mid do Inc(Lo);
        while strtofloat(ListBox1.items[hi])> Mid do Dec(Hi);
        if Lo <= Hi then
        begin
          T := ListBox1.items[lo];
          ListBox1.items[lo]:=ListBox1.items[Hi];
          ListBox1.items[Hi]:= T;
          Inc(Lo);
          Dec(Hi);
        end;
      until Lo > Hi;
      if Hi > iLo then QuickSort(iLo, Hi);
      if Lo < iHi then QuickSort(Lo, iHi);
    end;

Eller måske ikke?  Jeg fik: stack overflow

ok, jeg vil prøve igen med et tal array
Avatar billede ruma1974 Nybegynder
24. januar 2004 - 16:38 #3
ok, det virker når jeg laver et tal array så der er åbenbart en bug i min doven udgave
Avatar billede arne_v Ekspert
24. januar 2004 - 16:43 #4
Jeg kan godt få din kode til at virke med en list box !?
Avatar billede nca Juniormester
24. januar 2004 - 17:00 #5
Prøv med denne kode:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    ListBox2: TListBox;
    procedure Button1Click(Sender: TObject);
    procedure Quicksort;
    procedure init;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  talarray: array[1..10000] of real; //array som senere skal sorteres

implementation

{$R *.dfm}

Procedure TForm1.Init;
var
  i: Integer;
begin
  for i := 1 to 10000 do
    talarray[i ] := random(99999999)/100;
  for i:=1 to 30 do
    Listbox1.Items.Add(FloatToStr(talarray[i]));
end;


procedure TForm1.Quicksort;

  procedure Qsort_rek(venstre, hoejre: integer);  //underprocedure
  var
    midti, tempint: Real;
    h, j: integer;
  begin
    h := venstre;
    j := hoejre;
    midti := talarray[(venstre+hoejre) div 2];
    repeat
      while talarray[h] < midti  do
        inc(h);
      while talarray[j] > midti do
        dec(j);
      if h <= j then begin
        tempint := talarray[h];    //
        talarray[h] := talarray[j];     // trekantsbyt
        talarray[j] := tempint;    //
        inc(h);
        dec(j);
      end;
    until h > j;
    if venstre < j then
      Qsort_rek(venstre, j);
    if hoejre > h then
      Qsort_rek(h, hoejre);
    end;

begin
  Qsort_rek(1, 9999);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  init;
  quicksort;
  for i:=1 to 30 do
    Listbox2.Items.Add(FloatToStr(talarray[i]));
end;

end.
Avatar billede ruma1974 Nybegynder
24. januar 2004 - 18:44 #6
NCA -> Mange tak for eksemplet, men den del var allerede løst ovenfor.

Mit problem nu er at jeg får en stack overflow fjel når jeg sortere direkte fra en listbox.

Du får dog alligvel point da dette dog er mere rimligt end at jeg selv tager dem :-)
Avatar billede nca Juniormester
25. januar 2004 - 10:55 #7
Takker for pointene :-)
Proceduren er rekursiv, det vil sige at den hele tiden lægger nye værdier på stacken. Prøv evt at gå ind under Projects/Options/Memorysize og fordobbel MaxStackSize
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester