【计蒜客】基础算法入门之快速排序

很想写一个很好的文章引子,但是囿于语文水平有限,写不出什么好东西来,干脆就随便写点东西吧。之前写的文章都是关于爬虫的,爬虫虽好,但是写来写去就是那些东西,是时候学习点新东西了!现在自己很缺关于算法的知识,于是就上计蒜客学习了基础算法入门,但是苦于它教学用的是C++,而我大一学过C++,现在早就忘光了。于是我将写几篇系列文章,将计蒜客上面的C++算法改写成Python。

这是第四篇文章《快速排序》

以下文字摘自计蒜客

问题背景:

前面已经提到过,快速排序是一个基于分治思想的排序算法,也就是说这个算法是需要递归调用的。

我们再来详细讲述一遍快速排序的算法流程:

当我们处理从i到j的这段区间时,首先要从这段区间里选取一个数作为基准数,之后使用基准数将l到r的区间划分成两部分,左边的一半一定是比基准数小,而右边的一部分一定比基准数大。通过使用两个指针从数组的两侧向数组中心移动并同时进行交换操作,便能够达到这个目的。

之后递归调用计算两段子区间分别进行快速排序即可。


快速排序是C.R.A.Hoare于1962年提出的一种划分交换排序。它采用了一种分治的策略,通常称其为分治法(Divide-and-ConquerMethod)。

该方法的基本思想是:

1.先从数列中取出一个数作为基准数。

2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。

3.再对左右区间重复第二步,直到各区间只有一个数。


Python代码:

#-*- coding=utf-8-*-

def quick_sort(l,r):
	global dat
	i=l;j=r;mid=dat[r]
	while i<j:
		while dat[i]<mid:
			i+=1
		while dat[j]>mid:
			j-=1
		if i<=j:
			dat[i],dat[j]=dat[j],dat[i]
			i+=1;j-=1
			
	if l<j:quick_sort(l,j)
	if i<r:quick_sort(i,r)

dat=[1,3,8,4,2,6,10,5,11,7,9]
quick_sort(0,len(dat)-1)
print dat





你可能感兴趣的:(算法,python,快速排序)