Autor |
Beitrag |
GericasS
      
Beiträge: 540
Windows Vista Home Premium
D2010, VisualStudio2008
|
Verfasst: Do 20.11.08 22:45
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
_________________ Alexander N.
Neue Bewaffnung Amilo xi2428 T9300
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Do 20.11.08 22:48
Gegenfrage: Wer sagt denn, dass das so sein muss? 
_________________ We are, we were and will not be.
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: Do 20.11.08 22:50
h sollte sogar ein Integer sein - schließlich muss sie einen solchen Wert zwischenspeichern.
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Do 20.11.08 22:53
_________________ We are, we were and will not be.
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: 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.
_________________ Na denn, dann. Bis dann, denn.
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: 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 
      
Beiträge: 540
Windows Vista Home Premium
D2010, VisualStudio2008
|
Verfasst: 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 =/
_________________ Alexander N.
Neue Bewaffnung Amilo xi2428 T9300
|
|
ub60
      
Beiträge: 764
Erhaltene Danke: 127
|
Verfasst: 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 
      
Beiträge: 540
Windows Vista Home Premium
D2010, VisualStudio2008
|
Verfasst: Fr 21.11.08 22:46
Iwie will es trotzdem nicht so richtig...
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. |
_________________ Alexander N.
Neue Bewaffnung Amilo xi2428 T9300
|
|
Boldar
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: Fr 21.11.08 22:55
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: 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; |
_________________ We are, we were and will not be.
|
|
GericasS 
      
Beiträge: 540
Windows Vista Home Premium
D2010, VisualStudio2008
|
Verfasst: Fr 21.11.08 22:58
_________________ Alexander N.
Neue Bewaffnung Amilo xi2428 T9300
|
|
Yogu
      
Beiträge: 2598
Erhaltene Danke: 156
Ubuntu 13.04, Win 7
C# (VS 2013)
|
Verfasst: So 23.11.08 14:55
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: 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.
_________________ Na denn, dann. Bis dann, denn.
|
|
Th69
      

Beiträge: 4798
Erhaltene Danke: 1059
Win10
C#, C++ (VS 2017/19/22)
|
Verfasst: 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. de.wikipedia.org/wiki/Selection_Sort) ermittelt erst die Position und tauscht dann nur einmalig (je Element).
|
|
Gausi
      
Beiträge: 8548
Erhaltene Danke: 477
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Mo 24.11.08 11:45
_________________ We are, we were and will not be.
|
|