快速排序——分治法

用分治法解决快速排序问题

基本思想:侧重分解,简化合并

  1. 分解:数组划分
    选定一个元素作为数组的主元,作为数组的分界线
    主元左边的数小于主元右边的数

主元为固定位置的元素

'''
1. 选取固定位置的元素作为主元,一般为首元素或者尾元素
2. 定义i和j两个元素分别作为划分的两个部分的右端元素
3. 比较主元和arr[j],
	如果A[j]<=x:则交换A[j]和A[i+1],i和j同时右移
	如果A[j]>x:则j右移
4. 把主元放在两部分中间做分界线

'''

def Partition(Arr, p, r):
	"""
	:param Arr: 数组
    :param p: 起始位置
    :param r: 终止位置
    :return: 返回划分位置q即主元
	"""
	x = Arr[r]
	i = p - 1
	for j in range(p, r):
		if Arr[j] <= x:
			Arr[i + 1], Arr[j] = Arr[j], Arr[i + 1]
			i += 1
	Arr[i + 1], Arr[r] = Arr[r], Arr[i + 1]
	q = i + 1
	return q
def QuickSort(Arr, p, r):
	if p < r:
		q = Partition(Arr, p, r)
		QuickSort(Arr, p, q-1)
		QuickSort(Arr, q+1, r)
		return Arr

  1. 随机主元
    随机生成主元的两种方式:
    1. s = random.choice(range(p, r+1))
    2. s = random.randint(p,r)
import random
import numpy

def Partition(Arr, p, r):
	x = Arr[r]
	i = p - 1
	for j in range(p, r):
		if Arr[j] <= x:
			Arr[i + 1], Arr[j] = Arr[j], Arr[i + 1]
			i += 1
	Arr[i + 1], Arr[r] = Arr[r], Arr[i + 1]
	q = i + 1
	return q
def Randomized_Partition(Arr, p, r):
	s = random.randint(p, r)
	Arr[s], Arr[r] = Arr[r], Arr[s]
	q = Partition(Arr, p, r)
	return q
def Randomized_QuickSort(Arr, p, r):
	if p < r:
		q = Randomized_Partition(Arr, p, r)
		Randomized_QuickSort(Arr, p, q - 1)
		Randomized_QuickSort(Arr, q + 1, r)
	return Arr
if __name__ == "__main__":
	Arr = [2,1,3,5,8,7,6,4]
	Arr = numpy.array(Arr)	# 也可不转换为数组
	print(Randomized_QuickSort(Arr, 0, len(Arr)-1)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值