Or k smallest elements in an array.
// time: O(n)
x selectionRank(a, rank):
// rank is 0 based
if a == null || !(0 <= rank < a.length()):
throw
return selectionRankInner(a, rank)
x selectionRankInner(a, rank, start = 0, end = a.length() -1):
pivot, pivotindex = (a, start, end)
if rank < pivotindex:
return selectionRankInner(a, rank, start, pivotindex-1)
else if rank > pivotindex:
return selectionRankInner(a, rank, pivotindex+1, end)
return pivot
(pivot, pivotindex) partition(a, start, end):
// validations
if a == null || start > end || start < 0 || end >= a.length():
throw
pivotindex = random(start, end) //start, end inclusive
pivot = a[pivotindex]
swap(a, pivotindex, end)
lo = start
hi = end -1
while lo <= hi:
if a[lo] <= pivot:
lo++
else:
swap(a, lo, hi)
hi--
pivotindex = lo // pivotindex is lo = hi +1
swap(a, pivotindex, end)
return (pivot, pivotindex)
[Hat tip to ctci]
No comments:
Post a Comment