I'm trying to code the optimal algorithm to select the ith element the bigger of the list. For example, if array = [4,3,5,7] and I search for the 2nd one, the function would return 4.
I'm assuming the list has only distinct numbers here
Here is the problem:
The function sometimes return None.
And here is my code (the first function works well I think).
from random import shuffle
def partition(array, leftend, rightend, pivot):
""" I tested this one and it should work fine """
i = leftend
pivotindex = array.index(pivot) # only works if all values in array unique
array[pivotindex] = array[leftend]
array[leftend] = pivot
for j in range(leftend+1, rightend):
if array[j] < pivot:
temp = array[j]
array[j] = array[i]
array[i] = temp
i += 1
pivotindex = array.index(pivot) # only works if all values in array unique
leftendval = array[pivotindex] # Take the value of the pivot
array[pivotindex] = array[i]
array[i] = leftendval
return array
def RSelect(array, n, statistic_order):
""" list * int * int
statistic_order = the i th element i'm searching for """
new_array = [] # is used at the end of the function
if n == 1:
return array[0]
array_temp = array # Allows to have a shuffled list and
shuffle(array_temp)
pivot = array_temp[0] # Allows to have a random pivot
partition(array,0,n,pivot)
j = array.index(pivot)
if j == statistic_order:
return pivot
elif j > statistic_order:
for k in range(0,j):
new_array.append(array[k])
RSelect(new_array,j,statistic_order)
elif j < statistic_order:
for k in range(j+1,n):
new_array.append(array[k])
RSelect(new_array,(n-j)-1,statistic_order-j)