BFPRT算法及python实现

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   #一共分成这么多组
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值