快速排序Python实现

算法导论上的快速排序采用分治算法,步骤如下:

1.选取一个数字作为基准,可选取末位数字

2.将数列第一位开始,依次与此数字比较,如果小于此数,将小数交换到左边,最后达到小于基准数的在左边,大于基准数的在右边,分为两个数组

3.分别对两个数组重复上述步骤

其中一次排序步骤如下:

 

伪码实现:

QuickSort(A,p,r)
    if p<r
        then q = Partition(A,p,r)
            QucikSort(A,p,q-1)
            QucikSort(A,q+1,r)
 
Partition(A,p,r)
    x=A[r]
    i=p-1
    for j from p to r-1
        if A[j]<=x
            then i=i+1
                exchange A[i],A[j]
    exchange A[i+1],A[r]
    return i+1

  

Python实现代码如下:(也可看github:点我

# 记录快排程序
def QuickSort(arr, firstIndex, lastIndex):
    if firstIndex < lastIndex:  # 终止条件
        divIndex = Partition(arr, firstIndex, lastIndex)

        QuickSort(arr, firstIndex, divIndex)  # 递归调用前半部分
        QuickSort(arr, divIndex+1, lastIndex)  # 递归调用后半部分
    else:
        return


def Partition(arr, firstIndex, lastIndex):
    i = firstIndex - 1
    for j in range(firstIndex, lastIndex):
        if arr[j] <= arr[lastIndex]:
            i = i+1  # i记录前面有几个数比lastIndex的小,第一次执行Partition函数可让以arr[lastIndex]为中间值来分成两部分
            arr[i], arr[j] = arr[j], arr[i]
    arr[i+1], arr[lastIndex] = arr[lastIndex], arr[i+1]  # 将arr[lastIndex]的数据放在该放的地方,此时可保证前后两部分对arr[i+1]来说相对有序
    return i


if __name__ == '__main__':
    arr = [1, 4, 7, 1, 5, 5, 3, 85, 34, 75, 23, 75, 2, 0]
    print("initial array: \n", arr)
    QuickSort(arr, 0, len(arr)-1)
    print("result array: \n", arr)

  

posted @ 2019-03-05 15:46  Vancuicide  阅读(899)  评论(0编辑  收藏  举报