Avatar billede runem74 Nybegynder
08. april 2003 - 19:24 Der er 6 kommentarer og
2 løsninger

quicksort

Hej,

Jeg har bruge for en quicksort rutine der kan sortere et integer array. Jeg har kun fundet C eksempler som jeg har forsøgt at omskrive men det virker ikke helt. Kan den indbyggede quicksort function bruges til at sortere integer arrays? Eller er den kun til Tstringlist?

Mange hilsner,

Rune
Avatar billede dcgeek Nybegynder
08. april 2003 - 19:39 #1
procedure SorterEtArray(var a: TableArray; n: integer);
var i, k, v: integer;
begin
  for k:=1 to n-1 do begin
    i:=k;
    v:=a[i];
    while (i>0) and (a[i-1]>v) do begin
      a[i]:=a[i-1];
      dec(i);
    end;
    a[i]:=v;
  end;
end;
Avatar billede arne_v Ekspert
08. april 2003 - 19:48 #2
dcgeek>

Det er vist ikke en QuickSort !
Avatar billede runem74 Nybegynder
08. april 2003 - 19:49 #3
Tak for svaret, men det var en quicksort rutine jeg var efter dette er en bobblesort.

Mange hilsner,

Rune
Avatar billede doc404 Novice
08. april 2003 - 20:00 #4
{ TQuickSort }

  procedure TQuickSort.Sort(var A: array of Integer);

    procedure QuickSort(var A: array of Integer; iLo, iHi: Integer);
    var
      Lo, Hi, Mid, T: Integer;
    begin
      Lo := iLo;
      Hi := iHi;
      Mid := A[(Lo + Hi) div 2];
      repeat
        while A[Lo] < Mid do Inc(Lo);
        while A[Hi] > Mid do Dec(Hi);
        if Lo <= Hi then
        begin
          VisualSwap(A[Lo], A[Hi], Lo, Hi);
          T := A[Lo];
          A[Lo] := A[Hi];
          A[Hi] := T;
          Inc(Lo);
          Dec(Hi);
        end;
      until Lo > Hi;
      if Hi > iLo then QuickSort(A, iLo, Hi);
      if Lo < iHi then QuickSort(A, Lo, iHi);
    end;

  begin
    QuickSort(A, Low(A), High(A));
  end;
Avatar billede arne_v Ekspert
08. april 2003 - 20:02 #5
En hurtig konvertering fra C til standard Pascal:

program qstest(input,output);

type
  integer_array = array [0..10] of integer;

procedure qs(n : integer; var a: integer_array);

procedure qs_help(n1 : integer; n2 : integer; var a : integer_array);

var
  tmp,pivot : integer;
  l,r : integer;

begin
  l := n1;
  r := n2;
  pivot := a[(n1+n2) div 2];
  repeat
      while(a[l] < pivot) do l := l+1;
      while(a[r] > pivot) do r := r-1;
      if(l <=r ) then begin
        tmp := a[l];
        a[l] := a[r];
        a[r] := tmp;
        l := l+1;
        r := r-1;
      end;
  until(l>r);
  if(n1 < r) then qs_help(n1,r,a);
  if(l < n2) then qs_help(l,n2,a);
end;

begin
  qs_help(0, n-1, a);
end;

var
  a : integer_array;
  i : integer;

begin
  for i := 0 to 9 do a[i] := 10-i;
  for i:= 0 to 9 do writeln(a[i]);
  qs(10, a);
  for i:= 0 to 9 do writeln(a[i]);
end.
Avatar billede doc404 Novice
08. april 2003 - 20:03 #6
lidt for hurtig...

linien med VisualSwap skal fjernes...
Avatar billede Slettet bruger
08. april 2003 - 20:10 #7
Faktisk er der et vist overhead ved brug af rekursive kald, så på små arrays med 10-15 elementer kan det anbefales at benytte insertion sort eller bubble sort.

Så lad quicksort splitte array'sene op, og lad bubblesort om at sortere de mindste arrays.
Avatar billede runem74 Nybegynder
08. april 2003 - 20:21 #8
Fantastisk -

Mange tak,

Rune
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

Seneste spørgsmål Seneste aktivitet
22 min siden Ny printer, men hvilken Af mort1 i Printere
I går 19:41 USB på Linux Af Uvanga i Linux
12/0818:26 Hvilken type mus Af mort1 i PC
11/0813:21 ms Forms Af leahcim i Andet software
10/0821:30 Blokeret på Snapchat? Af LineP i Chat & Messaging