堆排序(Heap Sort)算法

目录

 

1、关于堆的相关定义

2、关于堆排序算法的基本过程

3、堆排序算法的代码实现


1、关于堆的相关定义

(二叉)堆数据结构是一种数组对象,其可视为一颗完全二叉树,树的每一层都是填满的,最后一层除外(最后一层从一个结点的左子树开始填)。表示堆得数组A是一个具有两个属性的对象:length[A]是数组中的元素的个数, heap_size[A]是存放在A中的堆元素个数。就是说虽然A[1 .. length[A]]中都可以包含有效值,但A[heap_size[A]]之后的元素都不属于响应的堆。此处heap\_size[A] \le length[A]

二叉堆分为两种:最大堆和最小堆。在最大堆中某个结点的值至多和其父节点的值一样大。这样,堆中最大元素就存放在根节点中。A[parent[i]] \ge A[i] (除根结点均满足)。最小堆则相反。

2、关于堆排序算法的基本过程

  • MAX-HEAPIFY 过程,其运行时间为O(lg(n)),保持最大堆性质的关键。
  • BUILD-MAX-HEAP过程,以线性时间运行,可以在无序的输入数组基础上构造出最大堆
  • HEAP-SORT过程,运行时间O(n*lg(n)), 对一个数组原地排序。

综上所述,heap sort 的时间复杂度为O(n*lg(n))。

3、堆排序算法的代码实现

#!/usr/bin/pyenv python

# This is a example for Heap Sort
import math


class heap:
    # initial the parameter for the heap
    def __init__(self, A):
        self.list = A[:]
        self.heapSize = len(self.list)
        # print self.heapSize

    # calculate the left & right child and the parent for given element
    def left(self, i):
        return 2 * (i + 1) - 1

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

    def parent(self, i):
        return math.floor((i - 1)/ 2)
    
    # change the i and j position
    def exchange(self, i, j):

        temp = self.list[i]
        self.list[i] = self.list[j]
        self.list[j] = temp
    
    # To make the heap be a legal max-heap
    def max_Heapify(self, i):
        l = self.left(i)
        r = self.right(i)

        largest = i
        if l < self.heapSize and self.list[largest] < self.list[l]:
            largest = l
        if r < self.heapSize and self.list[largest] < self.list[r]:
            largest = r
        if not largest == i:
            self.exchange(i, largest)
            self.max_Heapify(largest)
    
    # Using the array to build a max heap
    def buil_Max_Heapify(self):
        for i in range(self.heapSize / 2, -1, -1):
            self.max_Heapify(i)
    
    # sort algorithms
    def heapSort(self):
        for i in range(self.heapSize - 1, 0, -1):
            self.exchange(0, i)
            self.heapSize -= 1
            self.max_Heapify(0)

if __name__ == '__main__':
    A = [1, 7, 2, 6, 5, 10, 3, 0, 8]
    obj = heap(A)
    obj.buil_Max_Heapify()
    print obj.list
    obj.heapSort()
    print obj.list

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值