Da ihr ja Recht habt, mit der Aussage, dass Selbermachen besser ist, habe ich mich mal hingesetzt und unter für mich großem Aufwand einen Quicksortalgorithmus entworfen.
Leider funktioniert er nicht. Das Programm startet, aber enthält wohl Fehler, da ich ständig die slebe Fehlermeldung an unsteschiedlichen Stellen bekomme...
Exepction class "External SIGSEGV "
sowie
"Out of bounds"
Das ist der Quellcode:
Code: Alles auswählen
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);
private
procedure quicksort(var arr: array of integer);
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var arr:array[0..5] of integer;
i:integer;
begin
for i:=0 to length(arr) do
begin
arr[i]:=strtoint(listbox1.items[i]);
end;
quicksort(arr);
for i:=0 to length(arr) do
begin
listbox1.items[i]:=inttostr(arr[i]);
end;
end;
procedure TForm1.quicksort(var arr: array of integer);
var pivot,links,rechts:integer;
x:integer;
rechterabsch: array[0..5] of integer;
linkerabsch: array[0..5] of integer;
stelle:integer;
begin
if length(arr) > 1 then
begin
pivot := random(length(arr));
links:= arr[0];
rechts:= length(arr);
while links <= rechts do
begin
while arr[links] < arr[pivot] do
links := links + 1 ;
while arr[rechts] > arr[pivot] do
rechts:= rechts - 1 ;
if links <= rechts then
begin
x:= arr[links] ;
arr[links]:=arr[rechts] ;
arr[rechts]:=x;
links := links + 1 ;
rechts := rechts - 1 ;
end;
end;
for stelle:=0 to pivot do
begin
linkerabsch[stelle]:=arr[stelle]
end;
for stelle:=length(arr) downto pivot do
begin
rechterabsch[stelle]:=arr[stelle]
end;
quicksort(linkerabsch);
quicksort(rechterabsch);
end;
end;
end.
Findet jemand vllt. von euch einen grundlegenden Fehler?
Lg und sorry nochmals
Rawi