AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Sortieralgorithmus

Ein Thema von fabiO · begonnen am 9. Sep 2005 · letzter Beitrag vom 11. Sep 2005
 
fabiO

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

Problem mit Sortieralgorithmus

  Alt 9. Sep 2005, 14: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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:05 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz