RosettaCodeData/Task/Quickselect-algorithm/PureBasic/quickselect-algorithm.pureb...

38 lines
1.0 KiB
Plaintext

Procedure QuickPartition (Array L(1), left, right, pivotIndex)
pivotValue = L(pivotIndex)
Swap L(pivotIndex) , L(right); Move pivot To End
storeIndex = left
For i=left To right-1
If L(i) < pivotValue
Swap L(storeIndex),L(i)
storeIndex+1
EndIf
Next i
Swap L(right), L(storeIndex) ; Move pivot To its final place
ProcedureReturn storeIndex
EndProcedure
Procedure QuickSelect(Array L(1), left, right, k)
Repeat
If left = right:ProcedureReturn L(left):EndIf
pivotIndex.i= left; Select pivotIndex between left And right
pivotIndex= QuickPartition(L(), left, right, pivotIndex)
If k = pivotIndex
ProcedureReturn L(k)
ElseIf k < pivotIndex
right= pivotIndex - 1
Else
left= pivotIndex + 1
EndIf
ForEver
EndProcedure
Dim L.i(9)
For i=0 To 9
Read L(i)
Next i
DataSection
Data.i 9, 8, 7, 6, 5, 0, 1, 2, 3, 4
EndDataSection
For i=0 To 9
Debug QuickSelect(L(),0,9,i)
Next i