python3实现算法导论中的快速排序方法

def quick_sort(array, l, r):
    if l < r:
        q = partition(array, l, r)
        quick_sort(array, l, q - 1)
        quick_sort(array, q + 1, r)
 
def partition(array, l, r):
    x = array[r]
    i = l - 1
    for j in range(l, r):
        if array[j] <= x:
            i += 1
            array[i], array[j] = array[j], array[i]
    array[i + 1], array[r] = array[r], array[i+1]
    return i + 1

alist4 = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
quick_sort(alist4,0,len(alist4)-1)
print("快速排序:",alist4)

代码原地完成了对A[r]中数的移动,使之到达最终正确的位置。     下面的图详细给出了这个过程,A[r]成为了关键字x,整个过程结束后,4会到达正确的位置上。p,r是整个区间的起点和终点,是固定的。而i,j标明了两个区间的终点和起点,是在整个过程中不断修正的。i是一个关键的位置:i是比值关键字A[r]小的序列的末尾位置。i+1则是比A[r]大的数的区间的最左边的位置。i从整个区间最左端p-1开始不断增加。在整个过程结束之后,A[r]会和A[i+1]交换,就是和比A[r]大的序列的最左边的数交换,来达到A[r]的正确位置。(h步中的8和4交换)      j向左移动的条件是A[j]小于等于x。j要略过这些数值,因为这些数字本身比关键字x小,是符合要求的,所以i的值也要跟随增加。但是当A[j]的值大于x时,这个位置上的数不应该在x的左边区间,因此i不动,j继续右移。[i+1,j]就是比关键字大的数的区间。[p,i]是比关键字x小的区间。因为选取的关键字A[r]在区间的最右边,这个位置应该放比关键字大的数。因此,最后一步是将区间[i+1,j]的最左边的位置上的书和关键字交换。     上面给出的代码是的目标是升序有序,就是右边的数大于等于左边的数,这里由第5行决定。如果想要非增序排序,则i向右移动的条件是A[j] ≥ x。 --------------------- 本文来自 方法的角落 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/uestc_my/article/details/45600499?utm_source=copy

猜你喜欢

转载自blog.csdn.net/liangjiubujiu/article/details/82807801