Created
April 26, 2012 01:52
-
-
Save them0nk/2495150 to your computer and use it in GitHub Desktop.
Nth smallest number in an unsorted array
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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