117.info
人生若只如初见

堆排序的递归与非递归实现

堆排序(Heap Sort)是一种利用堆的数据结构进行排序的算法。它可以分为递归和非递归两种实现方式。

下面分别给出堆排序的递归和非递归实现代码:

递归实现

def heapify(arr, n, i):
    largest = i
    left = 2*i + 1
    right = 2*i + 2

    if left < n and arr[i] < arr[left]:
        largest = left
        
    if right < n and arr[largest] < arr[right]:
        largest = right

    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]
        heapify(arr, n, largest)
        
def heap_sort(arr):
    n = len(arr)

    for i in range(n//2 - 1, -1, -1):
        heapify(arr, n, i)

    for i in range(n-1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i]
        heapify(arr, i, 0)
        
    return arr

arr = [12, 11, 13, 5, 6, 7]
print("Sorted array is:", heap_sort(arr))

非递归实现

def heapify(arr, n, i):
    largest = i
    left = 2*i + 1
    right = 2*i + 2

    while True:
        if left < n and arr[i] < arr[left]:
            largest = left
        if right < n and arr[largest] < arr[right]:
            largest = right
        if largest == i:
            break
        arr[i], arr[largest] = arr[largest], arr[i]
        i = largest
        left = 2*i + 1
        right = 2*i + 2

def heap_sort(arr):
    n = len(arr)

    for i in range(n//2 - 1, -1, -1):
        heapify(arr, n, i)

    for i in range(n-1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i]
        heapify(arr, i, 0)
        
    return arr

arr = [12, 11, 13, 5, 6, 7]
print("Sorted array is:", heap_sort(arr))

以上代码分别给出了堆排序的递归和非递归实现方式。堆排序的时间复杂度为O(nlogn),空间复杂度为O(1)。

未经允许不得转载 » 本文链接:https://www.117.info/ask/fe00fAzsIAQ5VAVc.html

推荐文章

  • 使用c# sealed有哪些优势

    防止继承:使用sealed关键字可以阻止其他类继承该类,从而确保类的稳定性和完整性。 提高性能:由于sealed类无法被继承,编译器可以进行更多的优化,提高程序的性...

  • C#中sealed关键词的真正意义

    在C#中,sealed关键字用于修饰一个类,表示该类不能被继承。当一个类被标记为sealed时,其他类无法继承该类,即不能通过继承来扩展该类的功能。这意味着该类的实...

  • c# sealed与非密封类的区别

    在C#中,sealed关键字用于修饰类,表示该类不能被继承,即不能有子类。这是与非密封类的区别之一。
    另一个区别是,一个类可以被继承,而另一个类不能被继承...

  • 如何在C#中定义sealed类

    在C#中,可以使用关键字sealed来定义一个密封类(sealed class)。密封类是一种特殊的类,它不能被继承。
    以下是一个示例:
    sealed class SealedClass...

  • 堆排序的堆构建过程

    堆排序是一种基于二叉堆数据结构的排序算法,其中堆是一种特殊的二叉树结构,具有以下性质: 堆是一棵完全二叉树;
    堆中的每个节点的值都大于等于(或小于等...

  • 堆排序中的堆调整方法

    堆排序中的堆调整方法有两种:上浮和下沉。 上浮:也称为向上调整或堆化。当一个节点的值发生改变,可能导致它与父节点的大小关系不满足堆的性质(最大堆或最小堆...

  • C++ STL中的堆排序实现

    以下是使用C++ STL中的堆排序算法实现堆排序的示例代码:
    #include #include #include void heapSort(std::vector& arr) { std::make_heap(arr.begin(), ar...

  • 堆排序在大数据集中的应用

    堆排序在大数据集中的应用主要体现在以下几个方面: 大数据集的排序:堆排序适合对大数据集进行排序,因为其时间复杂度为O(nlogn),效率高,且不需要额外的空间开...