Python3实现快速排序 通俗易懂

Python3实现快速排序

快速排序 是一种交换排序,属于分治算法

思路:
对于要排序的元素集合,指定集合的第一个元素为基准点,通过一系列的扫描和交换(见下面的代码),让基准点左边的元素比基准点小,让基准点右边的元素比基准点大,这样分成了以基准点为界的左右两个子集合,对于每个子集合递归地重复上述步骤,直到每个最小集合只有一个元素时,就说明每个最小子问题解决完成,从而总问题解决完成。

代码:

# 快速排序 arr要排序的元素总集,left要排序的最左索引,right要排序的最右索引
def kp(arr, left, right):
    old_left = left
    old_right = right
    if left >= right:
        return
    base = arr[left] # 指定left为基准点,存储基准值
    toLeft = True # 扫描方向
    while left < right: # 只要left < right,就一直扫描;扫描的结束条件是left和right重合
        if toLeft: # 从右向左扫描:若找到比base小的,则把值赋给left处,然后left+1,扫描方向变为向右;否则继续向左扫描(right - 1)
            if arr[right] < base:
                arr[left] = arr[right]
                toLeft = False # 反转扫描方向
                left += 1
            else:
                right -= 1
        else: # 从左向右扫描:若找到比base大的,则把值赋给right,然后right-1,扫描方向变为向左;否则继续向右扫描(left + 1)
            if arr[left] > base:
                arr[right] = arr[left]
                toLeft = True # 反转扫描方向
                right -= 1
            else:
                left += 1
    arr[left] = base # 把记录的基准值赋值在left和right重合处
    
    # 继续对左右2个子问题进行递归求解,看,这就是分治算法思想(子问题相互独立不重合)
    kp(arr, old_left, left - 1)
    kp(arr, left + 1, old_right)


if __name__ == '__main__':
    arr = [5, 6, 3, 1, 7, 8, 19, 4, 88, -2]
    kp(arr, 0, len(arr) - 1)
    print(arr)
发布了24 篇原创文章 · 获赞 0 · 访问量 403

猜你喜欢

转载自blog.csdn.net/qq_18138105/article/details/105353637