Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Exchange Sort


GericasS - Do 20.11.08 22:45
Titel: Exchange Sort

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure SelectionSort(A:array of Integer);
var
x,y : LongInt ;
h : Word ;
begin
  for x := 0 to High(A) - 1 do
    for y := x+1 to High(A) do
      if a[x]>a[y] then
        begin
          h:=a[x];
          a[x]:=a[y];
          a[y]:=h;
        end;
end;


Meine Frage bezieht sich nur auf die Datentypen der Variablen..wieso müssen es LongInt und Word Typen sein und könne nicht wie bei BubbleSort Integer Variablen sein.

mfg,

GericasS


Gausi - Do 20.11.08 22:48

Gegenfrage: Wer sagt denn, dass das so sein muss? :gruebel:


Yogu - Do 20.11.08 22:50

h sollte sogar ein Integer sein - schließlich muss sie einen solchen Wert zwischenspeichern.


Gausi - Do 20.11.08 22:53

user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
h sollte sogar ein Integer sein - schließlich muss sie einen solchen Wert zwischenspeichern.


Ach Quatsch. Wer so riesige Zahlen in ein Array packt, der soll gefälligst die Pro-Version des Programms kaufen. :mrgreen:


alzaimar - Do 20.11.08 23:36

Die Zählvariablen sind logischerweise Datentypen, die negative Zahlen ausschließen.
'h' muss natürlich vom selben Typ der Array-Elemente sein.

Aus Gewohnheit (und auch Performancegründen? Spezialisten vor!) wird in der VCL und den "guten" 3rd-Party Libraries jedoch eigentlich immer der 'Integer' auch für Zählvariablen verwendet. Ich persönlich vermute, weil ich die Performancefrage nicht klären kann, einfach wesentlich weniger Arbeit, wenn man alle Warnungen und Hinweise des Compilers eliminieren möchte. Man verwendet dann einfach *nur* Integer und kann früher Feierabend machen.


Yogu - Fr 21.11.08 17:08

Bytes oder Words belegen genauso viel Speicher wie ein Integer - nämlich 32 Bit. Dann ist es (meines Wissens nach) egal, welchen Datentyp man nimmt - und Zählvariablen für Arrays sollten sowieso immer Integer sein, weil das eben die maximale Länge des Arrays ist. Warum nur die ersten 256 Elemente unterstützen?


GericasS - Fr 21.11.08 18:02

Danke für die zahlreichen Antworten..

kann mir nur noch jemand sagen warum die procedure nicht funktioniert, sie sortiert einfach nicht =/


ub60 - Fr 21.11.08 20:37

Der Quelltext muss so aussehen:


Delphi-Quelltext
1:
procedure SelectionSort(var A:array of Integer);                    

Sonst wird nur ein lokales Array innerhalb der Prozedur sortiert.
BTW: Wenn man sich die Stelle merkt, an der das Maximum/Minimum gefunden wurde, muss man nicht so oft tauschen.

ub60


GericasS - Fr 21.11.08 22:46

Iwie will es trotzdem nicht so richtig...


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    ListBox1: TListBox;
    ListBox2: TListBox;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  data : array [0..5of Integer ;

implementation

{$R *.dfm}

procedure SelectionSort(var A:array of Integer);
var
i,j,h,bis : Integer ;
begin
  bis := High(A);
  for i := 0 to bis -1 do
    for j := i+1 to bis do
      if a[i]>a[j] then
        begin
          h:=a[i];
          a[i]:=a[j];
          a[j]:=h;
        end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i : Integer ;
begin
  Randomize ;
  for i := 0 to 5 do
    begin
    data[i]:=random(345);
    ListBox1.Items.Add(IntToStr(Data[i]));
    end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
i : Integer ;
begin
  for i := 0 to 5 do
  begin
    SelectionSort(data[i]);
    ListBox2.Items.Add(IntToStr(data[i]));
  end;
end;

end.


Boldar - Fr 21.11.08 22:55

user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
Bytes oder Words belegen genauso viel Speicher wie ein Integer - nämlich 32 Bit.

Ist ein byte nicht 1 byte, also 8 bit?
Und Word 16 bit, sowie Dword = cardinal = 32 bit? (und Qword = 64 bit) :?: :?: :?: :?: :?: :?:


Gausi - Fr 21.11.08 22:55

Wenn Button2 sortieren soll, würde ich das mal so machen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Button2Click(Sender: TObject); 
var 
i : Integer ; 
begin 
  SelectionSort(data);   
  for i := 0 to 5 do 
  begin   
    ListBox2.Items.Add(IntToStr(data[i])); 
  end
end;


GericasS - Fr 21.11.08 22:58

user profile iconGausi hat folgendes geschrieben Zum zitierten Posting springen:
Wenn Button2 sortieren soll, würde ich das mal so machen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm1.Button2Click(Sender: TObject); 
var 
i : Integer ; 
begin 
  SelectionSort(data);   
  for i := 0 to 5 do 
  begin   
    ListBox2.Items.Add(IntToStr(data[i])); 
  end
end;


:oops: oh man danke Gausi :zustimm: ich hatte es schon vermutet das es an der Reihenfolge lag. :roll:

Trotzdem nochmal ein großes Danke an alle :wink:

Mfg,

GericasS


Yogu - So 23.11.08 14:55

user profile iconBoldar hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
Bytes oder Words belegen genauso viel Speicher wie ein Integer - nämlich 32 Bit.

Ist ein byte nicht 1 byte, also 8 bit?
Und Word 16 bit, sowie Dword = cardinal = 32 bit? (und Qword = 64 bit) :?: :?: :?: :?: :?: :?:

Ich meine, hier irgendwann mal gelesen zu haben, dass alle Ordinaltypen von Windows auf Integer aufgerundet werden, weil das performanter ist. Leider finde ich das entsprechende Thema jetzt nicht mehr.


alzaimar - So 23.11.08 17:05

Die Boundaries, also die Ausrichtung ist auf 4 Bytes gerundet, aber die Datengröße sowie das Verhalten sind 1, 2 bzw. 4 bittig. einfach mal im CPU-Fenster nachschauen. Bleibt die Frage, weshalb man Integer-Zählvariablen verwendet, wenn doch eh nur positive Indizes verwendet werden.


Th69 - Mo 24.11.08 11:23

Noch eine Anmerkung zum verwendeten Algorithmus: entgegen der Überschrift wird einfach nur der Bubblesort verwendet....
Der SelectionSort (oder auch Exchange Sort genannt, s.a. http://de.wikipedia.org/wiki/Selection_Sort) ermittelt erst die Position und tauscht dann nur einmalig (je Element).


Gausi - Mo 24.11.08 11:45

user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Noch eine Anmerkung zum verwendeten Algorithmus: entgegen der Überschrift wird einfach nur der Bubblesort verwendet....
Der SelectionSort (oder auch Exchange Sort genannt, s.a. http://de.wikipedia.org/wiki/Selection_Sort) ermittelt erst die Position und tauscht dann nur einmalig (je Element).

Ne, Bubblesort ist das auch nicht - denn da werden ja immer nur a[i] und a[i+1] vertauscht. Das hier ist also noch ein anderes Verfahren, irgendwie ein Zwitter aus Bubblesort und Selectionsort. ;-)