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
Yogu hat folgendes geschrieben : |
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 public end;
var Form1: TForm1; data : array [0..5] of 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
Yogu hat folgendes geschrieben : |
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
Gausi hat folgendes geschrieben : |
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
Boldar hat folgendes geschrieben : |
Yogu hat folgendes geschrieben : | 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
Th69 hat folgendes geschrieben : |
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. ;-)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!