42 lines
993 B
Plaintext
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()
|