Skip to content

Instantly share code, notes, and snippets.

@them0nk
Created April 26, 2012 01:52
Show Gist options
  • Save them0nk/2495150 to your computer and use it in GitHub Desktop.
Save them0nk/2495150 to your computer and use it in GitHub Desktop.
Nth smallest number in an unsorted array
def nthsmallest arr,startpos,endpos,nth
def choose_pivot arr,startpos,endpos
#THis is for selecting median of three , you can return a random number as well.
if ((arr[startpos] < arr[endpos]) and (arr[startpos] > arr[startpos+ (endpos-startpos)/2])) or ((arr[startpos] > arr[endpos]) and (arr[startpos] < arr[startpos+ (endpos-startpos)/2]))
return startpos
elsif ((arr[endpos] < arr[startpos]) and (arr[endpos] > arr[startpos+ (endpos-startpos)/2])) or ((arr[endpos] > arr[startpos]) and (arr[endpos] < arr[startpos+ (endpos-startpos)/2]))
return endpos
else
return startpos+ (endpos-startpos)/2
end
end
if (startpos - endpos == 0) and (nth == startpos)
return arr[startpos]
end
pivot = choose_pivot(arr,startpos,endpos)
arr[startpos],arr[pivot] = arr[pivot],arr[startpos]
part_pos = startpos + 1
for i in startpos+1..endpos
if arr[startpos] > arr[i]
arr[part_pos],arr[i] = arr[i],arr[part_pos]
part_pos += 1
end
end
arr[startpos],arr[part_pos-1] = arr[part_pos-1],arr[startpos]
if nth < (part_pos-1)
ret = nthsmallest(arr,startpos,part_pos-2,nth) if (part_pos - startpos - 2) >= 0
elsif nth > (part_pos-1)
ret = nthsmallest(arr,part_pos,endpos,nth) if endpos-part_pos >= 0
else
ret = arr[part_pos-1]
end
return ret
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment