算法导论:堆排序

本文深入讲解了堆排序算法中的核心部分——堆维护性质(max_heapify),并提供了两种实现方式:递归和非递归。此外,还展示了如何通过Python代码实现这两种方法,并通过实例演示了算法的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

堆排序

代码(python 2)只是实现了堆排序的核心代码:堆维护性质(max_heapify),而后的建堆、及排序都是基于堆得维护性质算法进行调用即可,暂时不做详解。



注意:
为了和书中的伪代码一致,对堆(以数组的形式表示)的操作从数组的第二个元素array[1]开始,第一个元素不作处理初始为0。



堆维护性质算法

1、基于递归实现:

"""
warning:
    1, This codes are based on chapter 6 of Introduction to Algorithms, so the array[0] to be
    initialized 0, and ignore array[0].
    2, The second element, array[1], will be treated as the root of the heap.
    3, At beginning, the heap_size = len(array)-1 because we don't operate array[0].
"""

'''
此时的Heap类暂时使用不到
'''
class Heap:
    def __init__(self, array, list_length, heap_size):
        self.A = array
        self.list_length = list_length
        self.heap_size = heap_size

    def heap_size_del(self):
        self.heap_size -= 1


def left(i):
    return 2*i


def right(i):
    return 2*i + 1


def max_heapify_recursion(array, i, heap_size):
    if (i > heap_size/2) or (array[i] > array[left(i)] and array[i] > array[right(i)]):
        return
    largest = i
    if i <= heap_size / 2 and array[i] < array[left(i)]:
        largest = left(i)
    if i <= heap_size / 2 and array[largest] < array[right(i)]:
        largest = right(i)
    if largest != i:
        temp = array[i]
        array[i] = array[largest]
        array[largest] = temp
    max_heapify_recursion(array, largest, heap_size)

实验如下:

heap = [0, 16, 4, 10, 14, 7, 9, 3, 2, 8, 1]
print heap
max_heapify_recursion(heap, 2, 10)
print heap

结果:

[0, 16, 4, 10, 14, 7, 9, 3, 2, 8, 1]
[0, 16, 14, 10, 8, 7, 9, 3, 2, 4, 1]

2、非递归实现:

def max_heapify(array, i, heap_size):
    check = True
    if (i > heap_size/2) or (array[i] > array[left(i)] and array[i] > array[right(i)]):
        return
    while check:
        largest = i
        if (i > heap_size/2) or (array[i] > array[left(i)] and array[i] > array[right(i)]):
            break
        elif i <= heap_size/2 and array[i] < array[left(i)]:
            largest = left(i)
        elif i <= heap_size/2 and array[largest] < array[right(i)]:
            largest = right(i)
        if largest != i:
            temp = array[i]
            array[i] = array[largest]
            array[largest] = temp
        i = largest

实验相同略过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值