from mergeSort_recursion import mergesort
import random
def partion(a, m, m_index):
#对a进行排序,使得比m小的元素放在m前面,比m大的元素放在m后面
#输入:m_index(m在a中的index)
#返回m前面, m后面各自元素的数目,以及m在新数组中的index
#将m与数组第一个元素交换位置,然后即可像快速排序一样将所有元素以m为中间元素
#分到左右两边
tmp = a[0]
a[0] = m
a[m_index] = tmp
i = 0
j = len(a)-1
control_m = a[0]
while i < j:
while i< j and a[j] >= control_m:
j -= 1
a[i] = a[j]
while i < j and a[i] <= control_m:
i += 1
a[j] = a[i]
#此时i = j, a[i]应该是最终的控制关键字所在位置
a[i] = control_m
print("m:{},after partion, a:{}".format(m, a))
return i, len(a)-i-1, i
def bfprt(a, k):
#得到a中第k大的元素
if len(a) < 5:
#元素数目不足5个时,排序后取index为k-1的数,即为第k大的元素
#由于只有在元素数目很小时才使用排序,因此时间复杂度很小,可以看作常数时间复杂度
mergesort(a,0, len(a)-1)
return a[k-1]
total_num = len(a)
splits = total_num//5 #一共分成这么多组