快排——基于荷兰国旗问题

#快排是基于荷兰国旗问题扩展的

# 快排1.0------时间复杂度:最差O(n**2)
# 保证最后一个数为区分数,保证不动,利用荷兰国旗问题排序,然后把最后一个值和大于区域的
#最后一个值交换,然后这个值左右两边分别进行递归

# 快排2.0
# 数组中最后一个数做划分值,<p   ==p    >p  直接把等于p的那一批都搞定了
#时间复杂度:最差O(n**2)
#最好:左右两边数差不多T(n) = 2(N/2) + O(N)


# 快排3.0———————时间复杂度:最差O(n*logN)
# 随机快排,快排的本体
# [L...R]等概率随机选择一个数,放在最后,然后做划分值
# 好坏情况各占1/N,数学证明得到时间复杂度O(n*logN)
import random
def swap(arr,i,j):
	tmp = arr[i]
	arr[i] = arr[j]
	arr[j] = tmp

def partition(arr,L,R):
	less = L -1
	more = R
	index = L
	while(index<more):
		if arr[index]<arr[R]:
			swap(arr,index,less+1)
			less +=1
			index +=1
		elif arr[index]>arr[R]:
			swap(arr,index,more-1)
			more -=1
		else:
			index += 1
	swap(arr, more, R)
	return [less+1,more]
def quickSort(arr,l,r):
	res = []
	if(l<r):
		# 找到一个随机数,然后与数组的最后一个数交换
		swap(arr,l+random.randint(0,r-l),r)
		#partition
		print('获取随机划分点{}'.format(arr))
		res = partition(arr,l,r)
		quickSort(arr,l,res[0]-1)
		quickSort(arr,res[0]+1,r)
def mian(arr):
	size = len(arr)
	if size<2:
		print(arr)
	quickSort(arr,0,size-1)


if __name__ == '__main__':
	arr = [1, 9, 2, 8, 6, 7, 2, 0, 1, 7]
	print(arr)
	mian(arr)
	print(arr)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值