Swap-Sort

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

Swap-Sort ist ein Sortieralgorithmus, der ein Array aus paarweise verschiedenen Zahlen sortiert.

Die Idee von Swap-Sort ist, von jedem Element eines Arrays A(1...n) die Anzahl m der kleineren Werte (die in A sind) zu zählen und das Element dann mit dem Element in A(m+1) zu vertauschen. Somit ist sichergestellt, dass das ausgetauschte Element bereits an der richtigen, also endgültigen Stelle steht.

Nachteil dieses Algorithmus ist, dass jedes Element nur einmal vorkommen darf, da sonst keine Terminierung erfolgt.

A ist ein Array mit n Elementen. Swap-Sort arbeitet in folgenden Schritten:

  1. Beginne mit i = 1
  2. Zähle, wie viele Elemente kleiner als A(i) sind, m sei diese Anzahl. Tausche danach A(i) mit A(m+1)
  3. Ist i = m+1, so erhöhe i um 1
  4. Ist i = n, so ist die Sortierung beendet. Andernfalls gehe wieder zu Schritt 2.

Es soll ein Array mit dem Inhalt {7,8,5,2,4,9,3,1} sortiert werden.

7 8 5 2 4 9 3 1 Mit dem Index 1 wird begonnen
^
9 8 5 2 4 7 3 1 7 wurde mit A(5+1) getauscht
^
1 8 5 2 4 7 3 9 9 wurde mit A(7+1) getauscht
^
1 8 5 2 4 7 3 9 der Index wurde erhöht, da die Anzahl m der
 ^ kleineren Elemente von A(1) gleich dem Index-1 war
1 3 5 2 4 7 8 9 8 wurde mit A(6+1) getauscht
 ^
1 5 3 2 4 7 8 9
 ^
1 4 3 2 5 7 8 9
 ^
1 2 3 4 5 7 8 9
 ^ 
1 2 3 4 5 7 8 9 der Index wurde erhöht, da die Anzahl m der
 ^ kleineren Elemente von A(2) gleich dem Index-1 war
1 2 3 4 5 7 8 9 ...usw.
 ^
1 2 3 4 5 7 8 9
 ^
1 2 3 4 5 7 8 9
 ^
1 2 3 4 5 7 8 9
 ^
1 2 3 4 5 7 8 9 Das Array wurde komplett durchlaufen,
 ^ das Sortieren ist somit beendet

Für die Bestimmung der Anzahl kleinerer Einträge ist ein vollständiger Array-Durchlauf nötig. Ein solcher muss für jedes Element des Arrays durchgeführt werden. Es ergibt sich eine Komplexität von O ( n 2 ) {\displaystyle {\mathcal {O}}(n^{2})} {\displaystyle {\mathcal {O}}(n^{2})}.

Implementierung

[Bearbeiten | Quelltext bearbeiten ]
procedure swapsort (a: in out vector) is
z:integer;
	function ziel_pos(z:integer) return natural is
		anz:natural:=0;
	begin
		for i in a'range loop
			if a(i) <= z then
				anz:=anz+1;
			end if;
		end loop;
		return anz;
	end
begin
	for index in a'range loop
		z:=ziel_pos(a(index));
		while z /= index loop
			< vertausche a(index) mit a(z) >;
			z:=ziel_pos(a(index));
		end loop;
	end loop;
end;
swapSortx=swapSort'x0where
swapSort'xi|i==lengthx=x
|i==smaller=swapSort'x(i+1)
|otherwise=swapSort'(swapxismaller)iwhere
smaller=countSmallerx(x!!i)
countSmaller=countSmaller'0
countSmallern[]_=n
countSmallern(x:xs)y|x<y=countSmaller(n+1)xsy
|otherwise=countSmallernxsy
swapxi1i2=insert(remove(insert(removexi1)e1(i2-1))i2)e2i1where
e1=x!!i1
e2=x!!i2
remove(x:xs)0=xs
remove(x:xs)n=x:removexs(n-1)
remove[]_=error"Index zu groß"
insertxy0=y:x
insert(x:xs)yn=x:insertxsy(n-1)
insert[]__=error"Index zu groß"
publicclass SwapSorter{
publicvoidsort(int[]sortMe){
intstartwert=0;
while(startwert<sortMe.length-1){
intkleinere=countSmallerOnes(sortMe,startwert);
if(kleinere>0){
inttmp=sortMe[startwert];
sortMe[startwert]=sortMe[startwert+kleinere];
sortMe[startwert+kleinere]=tmp;
}
else
{
startwert++;
}
}
}
privateintcountSmallerOnes(finalint[]countHere,finalintindex){
intcounter=0;
for(inti=index+1;i<countHere.length;i++){
if(countHere[index]>countHere[i]){
counter++;
}
}
returncounter;
}
// Testmain
publicstaticvoidmain(String[]args){
int[]a={3,7,45,1,33,5,2,9};
System.out.print("unsorted: ");
for(inti=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
System.out.println();
newSwapSorter().sort(a);
System.out.print("sorted: ");
for(inti=0;i<a.length;i++){
System.out.print(a[i]+" ");
}
}
}
def swap_sort(sortme):
 index = 0
 while index < len(sortme) - 1:
 new_index = sum(x < sortme[index] for x in sortme)
 if index == new_index:
 index += 1
 else:
 sortme[index], sortme[new_index] = sortme[new_index], sortme[index]
Abgerufen von „https://de.wikipedia.org/w/index.php?title=Swap-Sort&oldid=232486911"