排序算法第二篇-快速排序及其优化算法

快速排序

快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为较小和较大的2个子序列,然后递归地排序两个子序列。

步骤为:

挑选基准值:从数列中挑出一个元素,称为"基准"(pivot);
分割:重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(与基准值相等的数可以到任何一边)。在这个分割结束之后,对基准值的排序就已经完成;
递归排序子序列:递归地将小于基准值元素的子序列和大于基准值元素的子序列排序。

递归到最底部的判断条件是数列的大小是零或一,此时该数列显然已经有序。

选取基准值有数种具体方法,此选取方法对排序的时间性能有决定性影响。

选择基准(主元)的方法还有:
随机法
三数平均法

标准快排程序


```python
#标准快速排序算法

def partition(lists,low,high):

	q=low-1#初始化主元的位置索引
	pivot=lists[high]#获取主元值
	"""
	将数组划分为四部分:
	L[:q]:左数组,元素均小于等于主元
	R[q+1:]:右数据,元素均大于主元
	U[j:high-1]#待比较数据
	pivot:主元
	"""
	for j in range(low,high):
		if lists[j]<=pivot:
			q+=1
			lists[q],lists[j]=lists[j],lists[q]
			#当有小于等于主元的值时,就拓充左数组
			
	lists[q+1],lists[high]=lists[high],lists[i+1]
	#将主元放在最终位置,右数组的最左测
	return (q+1)#返回主元的索引值


def quick_sort(lists,low,high):
	#选取数组的最右侧元素作为主元
	if low <high:
		pi=partition(lists,low,high)
		#返回主元的索引位置,此时左边的元素均小于等于主元
		#右边的元素均大于主元
		quick_sort(lists,low,pi-1)
		#递归排组左数组
		quick_sort(lists,pi+1,high)
		#递归排序右数组

arr = [10, 7, 8, 9, 1, 5] 
n = len(arr) 
quick_sort(arr,0,n-1) 
print ("排序后的数组:") 
for i in range(n): 
    print ("%d" %arr[i]),
[动画演示](https://visualgo.net/zh/sorting)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值