Hey Leute
ich versuche gerade einen Sortieralgorithmus namens Shakersort zu schreiben, aber ich bekomme einen Fehler wo ich keinen sehe.
ich hoffe ihr könnt mir helfen.
Danke
DFPWare
Spoiler anzeigen
#include <Array.au3>
Dim $Feld[100]
Dim $neuesFeld[100]
For $i = 0 To 99 Step 1
$Feld[$i] = Random(1, 1000, 1)
Next
_ArrayDisplay($Feld)
$neuesFeld = _ShakerSort($Feld)
_ArrayDisplay($neuesFeld)
#cs
_ShakerSort
Der Array wird zu Erst von vorne nach hinten durchsucht und ausgetauscht, wie bei BubbleSort, aber nur einmal.
Dann wird der Array von hinten nach vorne durchsucht und ausgetauscht.
Danach ist die größte Zahl hinten und die kleinste Zahl vorne.
Dadurch müssen das erste und letzte Feld nicht mehr untersucht werden.
Das wird wiederholt und dann sind die beiden größten Zahlen hinten und die beiden kleinsten Zahlen vorne.
Das wird solange wiederholt, bis sich die beiden Fronten in der Mitte treffen.
Dann ist der Array sortiert.
Ein ähnliches Verfahren namens Selectsort funktioniert genauso, jedoch wird immer von vorne nach hinten durchsucht und immer nur das letzte Feld abgeschnitten.
#ce
Func _ShakerSort($iArray)
If UBound($iArray,0) <> 1 Then
MsgBox(0,"ERROR","Sie haben keinen eindimensionalen Array angegeben")
Exit
EndIf
$links = 0
$rechts = UBound($iArray,1)
Do
$iArray = _ShakerLinks($iArray,$links,$rechts)
$links -= 1
$iArray = _ShakerRechts($iArray,$links,$rechts)
$rechts -= 1
Until $links > $rechts
EndFunc
Func _ShakerLinks($lArray,$l,$r)
For $i=$l To $r-1 Step 1
ConsoleWrite($i&@CRLF)
If $lArray[$i] > $lArray[$i + 1] Then
_ArraySwap($lArray[$i + 1], $lArray[$i])
EndIf
Next
Return $lArray
EndFunc
Func _ShakerRechts($rArray,$l,$r)
For $i = $r-1 To $l Step 1
If $rArray[$i] < $rArray[$i - 1] Then
_ArraySwap($rArray[$i - 1], $rArray[$i])
EndIf
Next
Return $rArray
EndFunc