select largest K number from unsorted array Python

heap:

take klog(n) time



code is as follow"

def siftdown(A, start, end):
	root = start
	child = 2 * root + 1
	while child <= end:
		if child + 1 <= end and A[child] < A[child + 1]:
			child += 1
		if A[root] < A[child]:
			A[child], A[root] =  A[root], A[child]
			root = child
		else:
			return

def heapify(A, count):
	start = (count - 2) / 2
	while start >= 0:
		siftdown(A, start, count - 1)
		start = start -1

#def heapsort(A):
#	count = len(A)
#	heapify(A, len(A))
#	end = count - 1
#	while end > 0:
#		A[end], A[0] = A[0], A[end]
#		end -= 1
#		siftdown(A, 0, end)
#	return A

def topk(A, k):
	count = len(A)
	heapify(A, len(A))
	end = len(A) - 1
	while end > 0 and k > 0:
		A[end], A[0] = A[0], A[end]
		end -= 1
		k -= 1
		siftdown(A, 0, end)
	return A[end + s1:] 
#def drawmax(A):



A = [3, 4, 5, 1, 2, 0]



print topk(A, 3)


quick select take O(n) time find k values

import random

def partition(num, pivotIndex, left, right):
	pivot = num[pivotIndex]
	num[pivotIndex], num[right] = num[right], num[pivotIndex]
	storeIndex = left
	for i in range(left, right):
		if num[i]< pivot:
			num[storeIndex], num[i] = num[i], num[storeIndex]
			storeIndex += 1
	num[storeIndex], num[right] = num[right], num[storeIndex]
	return storeIndex

def quickselect(num, k):
	left = 0
	right = len(num) - 1
	
	while True:
		pivotIndex = random.randint(left,right)
		pivotNewIndex = partition(num, pivotIndex,left, right)
		dist = pivotNewIndex - left
		if dist == k:
			return num[pivotNewIndex]
		elif dist > k:
			right = pivotNewIndex - 1
		else:
			k -= (dist+1)
			left = pivotNewIndex + 1 		

num =[8, 9,0,1,2,3,6,7]

print quickselect(num,3)







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值