RosettaCodeData/Task/Quickselect-algorithm/Phix/quickselect-algorithm.phix

42 lines
993 B
Plaintext

global function quick_select(sequence s, integer k)
integer left = 1, right = length(s), pos
object pivotv, tmp
while left<right do
pivotv = s[k];
-- {s[k], s[right]} = {s[right], s[k]}
tmp = s[k]
s[k] = s[right]
s[right]=tmp
pos = left
for i=left to right do
if s[i]<pivotv then
-- {s[i], s[pos]} = {s[pos], s[i]}
tmp = s[i]
s[i] = s[pos]
s[pos]=tmp
pos += 1
end if
end for
-- {s[right], s[pos]} = {s[pos], s[right]}
tmp = s[right]
s[right] = s[pos]
s[pos]=tmp
if pos==k then exit end if
if pos<k then
left = pos + 1
else
right = pos - 1
end if
end while
return {s,s[k]}
end function
sequence s = {9, 8, 7, 6, 5, 0, 1, 2, 3, 4}
integer r
for i=1 to 10 do
{s,r} = quick_select(s,i)
printf(1," %d",r)
end for
{} = wait_key()