IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> python实现最大堆与堆排序 -> 正文阅读

[人工智能]python实现最大堆与堆排序

class MaxHeap:
    heap = []
    @staticmethod
    def insertNum(num):
        """ 插入元素 """
        MaxHeap.heap.append(num)
        MaxHeap.shift_up()

    @staticmethod
    def shift_up():
        """ 第一个元素放在索引为0的位置上 """
        current_id = len(MaxHeap.heap)-1
        parent_id = (current_id-1)//2
        while current_id > 0:
            if MaxHeap.heap[parent_id] >= MaxHeap.heap[current_id]:
                break
            else:
                MaxHeap.heap[parent_id], MaxHeap.heap[current_id] = \
                MaxHeap.heap[current_id],MaxHeap.heap[parent_id]
                current_id = parent_id
                parent_id = (current_id-1) // 2

    @staticmethod
    def deleteNum(num):
        """ 删除元素 """
        if num == MaxHeap.heap[-1]:
            MaxHeap.heap.pop()
            return
        temp = MaxHeap.heap.pop() # 最后一个元素
        ind = MaxHeap.heap.index(num)
        MaxHeap.heap[ind] = temp
        MaxHeap.shift_down(ind)

    @staticmethod
    def shift_down(ind):
        current_id = ind
        child_id_left = current_id*2 + 1
        child_id_right = current_id*2 + 2
        while current_id < len(MaxHeap.heap) - 1:
            if current_id*2 + 1 > len(MaxHeap.heap) - 1:
                # 当前节点为叶子节点, shift_down完成
                break
            if current_id*2 + 1 == len(MaxHeap.heap) - 1:
                # 只有左孩子
                if MaxHeap.heap[current_id] > MaxHeap.heap[-1]:
                    break
                else:
                    MaxHeap.heap[current_id],MaxHeap.heap[-1] = MaxHeap.heap[-1], \
                    MaxHeap.heap[current_id]
                    break
            # 既有左孩子,又有右孩子
            if MaxHeap.heap[current_id] > max(MaxHeap.heap[child_id_left],
                                            MaxHeap.heap[child_id_right]):
                # 如果已经比左右孩子大
                break
            else:
                # 和那个最大的孩子节点交换
                childInx = child_id_left if MaxHeap.heap[child_id_left] > MaxHeap.heap[child_id_right] \
                    else child_id_right
                MaxHeap.heap[childInx],MaxHeap.heap[current_id] = \
                MaxHeap.heap[current_id],MaxHeap.heap[childInx]
                current_id = childInx
                child_id_left = current_id*2+1
                child_id_right = current_id*2 + 2

    @staticmethod
    def extract_max():
        num = MaxHeap.heap[0]
        try:
            MaxHeap.deleteNum(num)
            return num
        except:
            return num

    @staticmethod
    def heap_sort(arr):
        for item in arr:
            MaxHeap.insertNum(item) # 建堆

        # 将堆顶元素一个一个弹出置入arr
        for i in range(len(arr)):
            arr[i] = MaxHeap.extract_max()

    @staticmethod
    def heapify(arr):
        MaxHeap.heap = arr
        n = (len(arr)-1)//2
        while n>=0:
            MaxHeap.shift_down(n)
            n -=1

    @staticmethod
    def heap_sort2(arr):
        MaxHeap.heapify(arr)
        res = []
        for i in range(len(arr)):
            res.append(MaxHeap.extract_max())
        return res

if __name__ == '__main__':
    s = MaxHeap()
    arr = [2,1,4,3,5]
    s.heap_sort(arr)
    print('sort1: ',arr)
    arr2 = [2, 1, 4, 3, 5]
    ans = s.heap_sort2(arr2)
    print('sort2: ', ans)

  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-09-09 11:45:02  更:2021-09-09 11:48:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 15:49:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码