快速排序

# 其实思想是蛮简单的,就是通过第一遍的遍历(让left和right指针重合)来找到数组的切割点。
# 第一步:首先我们从数组的left位置取出该数(20)作为基准(base)参照物。
# 第二步:从数组的right位置向前找,一直找到比(base)小的数,
# 如果找到,将此数赋给left位置(也就是将10赋给20),
# 此时数组为:10,40,50,10,60,
# left和right指针分别为前后的10。
# 第三步:从数组的left位置向后找,一直找到比(base)大的数,
# 如果找到,将此数赋给right的位置(也就是40赋给10),
# 此时数组为:10,40,50,40,60,
# left和right指针分别为前后的40。
# 第四步:重复“第二, 第三“步骤,直到left和right指针重合,
# 最后将(base)插入到40的位置,
# 此时数组值为: 10,20,50,40,60,至此完成一次排序。
# 第五步:此时20已经潜入到数组的内部,20
# 的左侧一组数都比20小,20
# 的右侧作为一组数都比20大,
# 以20为切入点对左右两边数按照
# "第一,第二,第三,第四"
# 步骤进行,最终快排大功告成。

# 1、先从数列中取出一个数作为基准数
#
# 2、分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边
#
# 3、再对左右区间重复第二步,直到各区间只有一个数

# 概括来说为 挖坑填数+分治法
#
# 下面举例来进行说明,主要有三个参数,i为区间的开始地址,j为区间的结束地址,X为当前的开始的值
#
# 第一步,i=0,j=9,X=21
#
# 0 1 2 3 4 5 6 7 8 9
# 21 32 43 98 54 45 23 4 66 86
# 第二步,从j开始由,后向前找,找到比X小的第一个数a[7]=4,此时i=0,j=6,X=21
# 进行替换
#
# 0 1 2 3 4 5 6 7 8 9
# 4 32 43 98 54 45 23 21 66 86
# 第三步,由前往后找,找到比X大的第一个数a[1]=32,此时i=2,j=6,X=21
#
# 0 1 2 3 4 5 6 7 8 9
# 4 21 43 98 54 45 23 32 66 86
# 第四步,从j=6开始由,由后向前找,找到比X小的第一个数a[0]=4,此时i=2,j=0,X=21,发现j<=i,所以第一回结束
#
# 可以发现21前面的数字都比21小,后面的数字都比21大
# 接下来对两个子区间[0,0]和[2,9]重复上面的操作即可
#
# 下面直接给出过程,就步详细解说了
#
# i=2,j=6,X=43
#
# 0 1 2 3 4 5 6 7 8 9
# 4 21 43 98 54 45 23 32 66 86
# i=4,j=6,X=43
#
# 0 1 2 3 4 5 6 7 8 9
# 4 21 32 98 54 45 23 43 66 86
# i=4,j=5,x=43
#
# 0 1 2 3 4 5 6 7 8 9
# 4 21 32 43 54 45 23 98 66 86
# i=5,j=5,x=43
#
# 0 1 2 3 4 5 6 7 8 9
# 4 21 32 23 43 45 54 98 66 86
# 然后被分为了两个子区间[2,3]和[5,9]
#
# ….最后排序下去就是最终的答案
#
# 0 1 2 3 4 5 6 7 8 9
# 4 21 23 32 43 45 54 66 86 98
# 总结:
#
# 1.i =L; j = R; 将基准数挖出形成第一个坑a[i]。
#
# 2.j–由后向前找比它小的数,找到后挖出此数填前一个坑a[i]中。
#
# 3.i++由前向后找比它大的数,找到后也挖出此数填到前一个坑a[j]中。
#
# 4.再重复执行2,3二步,直到i==j,将基准数填入a[i]中。
#先从右往左找一个小于6的数,再从左往右找一个大于6的数,然后交换。
#挖坑填数法
def QuickSort(array,left,right):
if left<right:
i,j = left,right
key=array[i]
while i<j:
while i<j and array[j]>=key:
j-=1
array[i] = array[j]

while i<j and array[i]<=key:
i+=1
array[j]=array[i]
array[i]=key
QuickSort(array,left,i-1)
QuickSort(array,j+1, right)
return array

print QuickSort([21,32,43,98,54,45,23,4,66,86],0,9)
posted @ 2018-09-03 14:59  automation_test  阅读(107)  评论(0)    收藏  举报