交换排序 —— 快速排序

快速排序

快速排序是在等待排序的n个记录中随机取出一个元素作为基准,比基准小的元素放到基准左边,比基准大的放到基准的右边。

然后分别对基准两边的子序列进行上一步的操作。递归的进行,直到排序完成。

可以设置两个游标分别对序列左右两端的元素进行跟踪。以方便和基准比较大小进行移动。

如图所示,low 和 heigh分别代表序列的两端。

设置两个游标,初始值均放在两端。

假设我们取得 基准元素就是该序列的最后一个元素 ,将其放在 一个临时变量上 如:temp  temp=4 

游标 i 的作用自左向右移动,找出比基准大的元素,

游标 j 的作用就是自右向左,找到比基准小的元素。

排序开始:
率先移动 i  发现 i 当前指向的元素为 8 ,且 8>4 因此把 8 放到序列的最右边,也就是 j 所在的位置。

i 已经找到了比 基准小的元素,并实现了元素的交换,那么 i 就暂时停在此处 ,移动 j 

j 当前元素为8,8>4 ,向左移动 j ,j = 6 ,6>4,继续向左移动 j ,j=3 <4, 停止移动 j ,并且把 j 所指向的元素放到 i 的位置,准备移动 i

向右移动 i ,i =2, 2<4 , 继续向右移动,i=7, 7>4,停止移动 i ,并将 i 所指向的元素放到 j 的位置。准备移动 j

向左移动 j ,j = 1,1<4, 停止移动 j  将 j 指向的元素放到 i 的位置。准备移动 i

向右移动 i ,i = 5,5>4 ,停止移动 i, 将 i 所指向的值,放到 j 的位置。向左移动 j 

向左移动 j ,发现 i == j 停止移动 i 和 j ,该位置即为 基准元素应该在的位置。

这就是一趟快排的过程。然后分别对基准左右两端递归的进行上述操作。直至完成。

 代码如下:

def quickSort(A,low,heigh):
    i = low   # 初始化 i 位于最左边
    j = heigh  #初始化 j  位于最右边
    if low< heigh:
        temp = A[j]   # 取最右边为基准
        while i != j:   #只要 i!= j ,就循环的移动 i 和 j
            while i<j and A[i] <=temp:  # 只要 i 比 j 小,且 i 所指向的变量小于基准变量,那么就不断的向右移动 i
                i +=1
            A[j]= A[i]    #当碰到 比temp 大的变量时,那么就将 当前变量放到 j 所在的位置。
            while j>i and A[j]>=temp:  # 只要 j 比 i 大,且,j 所指向的变量大于 基准变量,那么就不断向左移动 j
                j -= 1
            A[i]=A[j]   #直到 碰到比temp 小的变量,那么就向 当前变量放到 i 当前的位置。

        A[i] = temp   #当 i==j 时,i、j指向了同一个元素。表示i,j都已经对各自半边遍历完成,并实现了大小元素间的互换,当前位置即基准变量应该在的位置。
        quickSort(A,low,i-1) #递归的对 A的左半部分进行以上动作,只是此时A的范围不再是整个序列了,而是 [0 ,i-1] 序列最左边到基准变量左侧元素
        quickSort(A,i+1,heigh)  #递归的对A 的有半部分进行上述动作,此时A的范围为 [i+1,heigh] 基准变量右侧到 序列最右边
        return  A

A=[8,2,7,5,1,3,6,4]
low=0
heigh = len(A)-1
print(quickSort(A,low,heigh))
View Code
原文地址:https://www.cnblogs.com/jijizhazha/p/6121650.html