快速排序算法是一种分治排序算法。它将数组划分为两个部分,而后分别对两个部分进行排序。经过一次排序,算法将达到以下目的:python
1.对于某个i,a[i]在数组的最终位置上。所谓最终位置,即该数组通过彻底排序后各个元素的位置。算法
2.a[1],….,a[i-1]中的元素都比a[i]小。数组
3.a[i+1],….,a[r]中的元素都比a[i]大。r是最后一个序号。ui
快速排序是一个递归划分过程。咱们对一个文件进行划分,划分的原则是将一些元素(划分元素)放在它们最终应该在的位置上。比划分元素小的元素都在划分元素的左边,比划分元素大得元素都在划分元素的右边。而后分别对左右两部分分别递归处理。spa
选定a[0]做为划分元素。而后首先从左到右寻找比a[0]大的元素,找到后中止。接着从右到左寻找比a[0]小的元素,找到后中止。将这两个元素交换。这样小的元素被排到了a[0]的左边,大的元素被排到了右边。继续刚才的旅途,不断的左右交换。最后划分元素a[i]也作了交换,放到了它的最终位置上。.net
对于数组A [7,9,0,1,3,1,5]其过程以下:code
第一次排序blog
将A[0]=7设为划分元素。排序
1.因为是将A[0]设为划分元素,因此右游标先移动。右游标停留在A[6]=5上,由于5小于7。将A[0]与A[6]交换.递归
2.而后移动左游标,游标停留在A[1]=9上,由于9大于7。将A[1]与A[6]交换。
3.移动右游标,游标停留在A[5]=1上,将A[1]与A[5]交换
4.移动作游标一直移动到A[5]=7,此时左游标和右游标相会,这次排序结束。划分元素7,处于最终位置。
第一次排序的结果将数组分为两个部分。第一部分是A[0]~A[4],由小于7的元素组成,第二部分为A[6],由大于7的元素组成。接下来的操做是将第一次排序的步骤在这些分组中从新再来一遍。首先是A[0]~A[4]部分。
第二次排序
将A[0]=5设为划分元素。
1.一样的从右游标开始。右游标定位到A[4]=3,由于3小于划分元素5。将A[0]与A[4]交换。
2.开始移动左游标,一直到A[4]=5。此时左游标和右游标相会,这次排序结束。划分元素5处于最终位置。
接下来的排序就是不断的递归了,直到每一个元素都处于最终位置为止。
第三次排序
第四次排序
第五次排序
第六次排序
当左边的部分都递归结束后,开始递归右边部分。
第七次排序
结果
在以上的例子中划分元素的位置其实很重要。以最左端做为划分元素,游标就应该从右边先移动;以最右端做为划分元素,游标就应该从左边先开始。这是为了解决顺序数组的问题。一个数组如[1,2,3,4,5],划分元素为最左边,且左游标先移动,那么第一次排序的后果就会是[5,2,3,4,1]。这是一个错误的结果,将使排序永远进行下去。
python代码实现:
#!/usr/bin/env python def swap(array,i,j): temp = array[i] array[i]=array[j] array[j]=temp def parition(arry,begin,end): temp = array[begin] while 1: while begin<end: if(array[end]<temp): swap(array,begin,end) break else: end -=1 while begin<end: if(array[begin]>temp): swap(array,begin,end) break else: begin += 1 if(begin == end): break print array return begin def quickSort(array,begin,end): i=parition(array,begin,end) if begin<i-1: print '------------right' quickSort(array,begin,i-1) if i+1<end: print '------------left' quickSort(array,i+1,end) if __name__=="__main__": array=[7,9,0,1,3,1,5] quickSort(array,0,len(array)-1) print array
参考文档:
http://my.oschina.net/997155658/blog/311407
《算法:C语言实现》