''' mbinary
#########################################################################
# File : select.py
# Author: mbinary
# Mail: zhuheqin1@gmail.com
# Blog: https://mbinary.xyz
# Github: https://github.com/mbinary
# Created Time: 2018-07-06  17:13
# Description:
#########################################################################
'''

from random import randint
def select(lst,i):
    lst = lst.copy()
    def partition(a,b):
        pivot = lst[a]
        while a<b:
            while a<b and lst[b]>pivot: b-=1
            if a<b:
                lst[a] = lst[b]
                a+=1
            while a<b and lst[a]<pivot: a+=1
            if a<b:
                lst[b] = lst[a]
                b-=1
        lst[a]= pivot
        return a

    def _select(a,b):
        if a>=b: return lst[a]
        # randomized select
        n = randint(a,b)
        lst[a],lst[n] = lst[n],lst[a]
        pos = partition(a,b)
        if pos>i:
            return _select(a,pos-1)
        elif pos<i:
            return _select(pos+1,b)
        else:return lst[pos]
    return _select(0,len(lst)-1)


if __name__ =='__main__':
    lst = [randint(0,1000) for i in range(100)]
    st = sorted(lst)
    for i in range(10):
        n = randint(0,99)
        print('select {}th: \nexpect: {}\ngot: {}'.format(n,st[n],select(lst,n)))
