Autor Beitrag
GericasS
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 540

Windows Vista Home Premium
D2010, VisualStudio2008
BeitragVerfasst: Do 20.11.08 22:45 
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Do 20.11.08 22:48 
Gegenfrage: Wer sagt denn, dass das so sein muss? :gruebel:

_________________
We are, we were and will not be.
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Do 20.11.08 22:50 
h sollte sogar ein Integer sein - schließlich muss sie einen solchen Wert zwischenspeichern.
Gausi
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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:

_________________
We are, we were and will not be.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 540

Windows Vista Home Premium
D2010, VisualStudio2008
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 764
Erhaltene Danke: 127



BeitragVerfasst: Fr 21.11.08 20:37 
Der Quelltext muss so aussehen:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 540

Windows Vista Home Premium
D2010, VisualStudio2008
BeitragVerfasst: Fr 21.11.08 22:46 
Iwie will es trotzdem nicht so richtig...

ausblenden volle Höhe 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.

_________________
Alexander N.
Neue Bewaffnung Amilo xi2428 T9300
Boldar
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1555
Erhaltene Danke: 70

Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: Fr 21.11.08 22:55 
Wenn Button2 sortieren soll, würde ich das mal so machen:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 540

Windows Vista Home Premium
D2010, VisualStudio2008
BeitragVerfasst: 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:
ausblenden 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

_________________
Alexander N.
Neue Bewaffnung Amilo xi2428 T9300
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 8548
Erhaltene Danke: 477

Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
BeitragVerfasst: 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. 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. ;-)

_________________
We are, we were and will not be.