堆排序与快速排序 python实现

1. 堆排序

堆排序是通过构建一个最大堆实现的。

  • 步骤1:先从非叶子节点向下调整元素,形成一个最大堆;
  • 步骤2:然后将堆顶元素与未排序序列末尾的元素交换,再从根节点调整形成一个最大堆;
  • 重复步骤2直到排序完成
def sift_down(array, root, end):
    # 从root开始向下调整元素
    while True:
        child = 2*root + 1
        if child > end:
            break
        if child + 1 <= end and array[child] < array[child+1]:
            child += 1
        if array[root] < array[child]:
            array[root], array[child] = array[child], array[root]
            root = child
        else:
            break
    
def heap_sort(array, l, r):
    # 从非叶子节点开始调整成最大堆
    for i in range(len(array)//2-1, -1, -1):
        sift_down(array, i, r)
    
    # 进行堆排序
    for i in range(r, 0, -1):
        array[0], array[i] = array[i], array[0]
        sift_down(array, 0, i-1)
    
test = [2,3,4,5,1,2,6,7,4,3,2]
heap_sort(test, 0, len(test)-1)
print(test)
# [1, 2, 2, 2, 3, 3, 4, 4, 5, 6, 7]

2. 快速排序

快速排序是先找到一个位置,使得该位置左边的元素都比它小,该位置右边的元素都比它大;

然后递归地对左边子序列和右边子序列这样排序。

def quick_sort(array, l, r):
    # 快速排序
    if l < r:
        p = partition(array, l, r)
        quick_sort(array, l, p-1)
        quick_sort(array, p+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

test = [2,3,4,5,1,2,6,7,4,3,2]
quick_sort(test, 0, len(test)-1)
print(test)
# [1, 2, 2, 2, 3, 3, 4, 4, 5, 6, 7]

猜你喜欢

转载自blog.csdn.net/Ahead_J/article/details/88995821