Einzelnen Beitrag anzeigen

fabiO

Registriert seit: 5. Dez 2004
Ort: Jena
41 Beiträge
 
Delphi 6 Personal
 
#1

Problem mit Sortieralgorithmus

  Alt 9. Sep 2005, 15:48
Hallo,

Also ich habe ein Problem mit dem Quicksort Sortieralgorithmus.

Ich muss eine Liste von Namen, welche ich in einer Listbox darstelle, alphabetisch sortieren.
Jedoch muss ich dabei diesen Sortieralgorithmus verwenden:

Delphi-Quellcode:
PROCEDURE Quicksort ( Von , Bis : LongInt);

VAR   lz,rz   : LongInt;
   t   :   Byte;      { Trennelement         }
   hilf   :   Byte;

BEGIN
  lz := Von; rz := Bis;      { linker und rechter Zeiger   }
  t := F [ ( Von+Bis ) DIV 2 ];      { Trennelement aus Folgenmitte   }

  REPEAT

    WHILE F[lz] < t DO Inc(lz);      { linker Zeiger nach rechts   }
    WHILE t < F[rz] DO Dec(rz);      { rechter Zeiger nach links   }
    IF lz <= rz THEN         { falls keine šberschneidung...   }
      BEGIN
   hilf := F[lz];         { dann Austausch der Elemente   }
   F[lz] := F[rz]; { die bezglich dem Trennelement}
   F[rz] := hilf;         { auf der falschen Seite stehen   }
   Inc(lz);         { Anschlieáend die Zeiger eine   }
   Dec(rz);         { Position weiterrcken      }
      END { Tauschen }

  UNTIL lz > rz;         { bis šberschneidung der Zeiger   }

  IF Von < rz THEN QuickSort ( Von , rz); { linkes Teilfeld sortieren }
  IF lz < Bis THEN QuickSort ( lz, Bis ); { rechtes Teilfeld sortieren }

END;
Mein Problem ist nun, das ich nicht weiss inwiefern ich den Algorithmus ändern muss, damit ich damit auch String sortieren kann und nicht nur Integerwerte, oder wie ich die namen so einlesen kann das sie als Integerwert sortiert werden ( Das mit dem ASCII Code hab ich schon versucht, da komme ich nicht weiter).

Danke schonmal im Vorraus für eure Hilfe.

Ach ja hier noch der gesamte Code:

Delphi-Quellcode:
unit Unit1;

interface

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

CONST   Max = 1000000;

type
  Feld = ARRAY [ 1..Max] OF Byte;
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    Button2: TButton;
    Edit1: TEdit;
    Button3: TButton;
    StringGrid1: TStringGrid;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1 : TForm1;
  Namen : TStringList;
  F : Feld;
  bla : Array[0..9] of String;
  
implementation

{$R *.dfm}

{procedure anzeigen (grid : TStringGrid);
var x : Integer;
begin
For x := 0 to 7 do
  begin
    grid.Cells[x,0] := IntToStr(Werte[x,0]);
    grid.Cells[x,1] := IntToStr(Werte[x,1]);
  end;
end;}


PROCEDURE Quicksort ( Von , Bis : LongInt);

VAR   lz,rz   : LongInt;
   t   :   Byte;      { Trennelement         }
   hilf   :   Byte;

BEGIN
  lz := Von; rz := Bis;      { linker und rechter Zeiger   }
  t := F [ ( Von+Bis ) DIV 2 ];      { Trennelement aus Folgenmitte   }

  REPEAT

    WHILE F[lz] < t DO Inc(lz);      { linker Zeiger nach rechts   }
    WHILE t < F[rz] DO Dec(rz);      { rechter Zeiger nach links   }
    IF lz <= rz THEN         { falls keine šberschneidung...   }
      BEGIN
   hilf := F[lz];         { dann Austausch der Elemente   }
   F[lz] := F[rz]; { die bezglich dem Trennelement}
   F[rz] := hilf;         { auf der falschen Seite stehen   }
   Inc(lz);         { Anschlieáend die Zeiger eine   }
   Dec(rz);         { Position weiterrcken      }
      END { Tauschen }

  UNTIL lz > rz;         { bis šberschneidung der Zeiger   }

  IF Von < rz THEN QuickSort ( Von , rz); { linkes Teilfeld sortieren }
  IF lz < Bis THEN QuickSort ( lz, Bis ); { rechtes Teilfeld sortieren }

END;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Namen := TStringlist.Create;

  Namen.Add('Anja');
  Namen.Add('Christoph');
  Namen.Add('Christian');
  Namen.Add('Daniel');
  Namen.Add('Dimitri');
  Namen.Add('Eldar');
  Namen.Add('Franz');
  Namen.Add('Fabio');
  Namen.Add('Peter');
  Namen.Add('Michi');
end;

procedure TForm1.Button1Click(Sender: TObject);
var x : Integer;
begin
  Randomize;
  for x := 1 to 10 do
    namen.Exchange(random(namen.Count), random(namen.Count));
  Listbox1.Items.Clear;
  ListBox1.Items.AddStrings(Namen);
end;

procedure TForm1.Button3Click(Sender: TObject);
var x : Integer;
begin
  Randomize;
  if Edit1.Text = 'then
    showmessage('Bitte geben sie einen Namen ein')
  else begin
    Namen.Add(Edit1.Text);
    for x := 1 to 10 do
      namen.Exchange(random(namen.Count), random(namen.Count));
    Listbox1.Items.Clear;
    ListBox1.Items.AddStrings(Namen);
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var i : Integer;
begin
  For i := 0 to high(bla) do begin
    bla[i] := Namen.Strings[i];
    Stringgrid1.Cells[i,0] := (bla[i]);
  end;
  //quicksort(bla[0], bla[high(bla)]);
end;

end.
  Mit Zitat antworten Zitat