其他分享
首页 > 其他分享> > 快排简易版本与堆排

快排简易版本与堆排

作者:互联网

三行代码实现快速排序;并整理堆排代码

快排:

步骤

  1. 从数列中挑出一个元素,称为”基准”(pivot),
  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
def qsort(arr):
    if len(arr) <= 1:
        return arr
    else:
        pivot = arr[0]
        return qsort([x for x in arr[1:] if x < pivot]) + \
               [pivot] + \
               qsort([x for x in arr[1:] if x >= pivot])

 堆排:

步骤:

  1. 创建最大堆:将堆所有数据重新排序,使其成为最大堆
  2. 最大堆调整:作用是保持最大堆的性质,是创建最大堆的核心子程序
  3. 堆排序:移除位在第一个数据的根节点,并做最大堆调整的递归运算
def heap_sort(list):
    # 创建最大堆
    for start in range((len(list) - 2) // 2, -1, -1):
        sift_down(list, start, len(list) - 1)

    # 堆排序
    for end in range(len(list) - 1, 0, -1):
        list[0], list[end] = list[end], list[0]
        sift_down(list, 0, end - 1)
    return list

# 最大堆调整
def sift_down(lst, start, end):
    root = start
    while True:
        child = 2 * root + 1
        if child > end:
            break
        if child + 1 <= end and lst[child] < lst[child + 1]:
            child += 1
        if lst[root] < lst[child]:
            lst[root], lst[child] = lst[child], lst[root]
            root = child
        else:
            break

 

标签:堆排,end,数列,基准值,简易,list,len,快排,start
来源: https://blog.csdn.net/qq_38742161/article/details/90407879