ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

大话算法-排序-堆排序

2019-04-04 09:43:24  阅读:210  来源: 互联网

标签:index list 大话 larger 堆排序 排序 data 节点 size


堆排序:大根堆要求每个节点的值都小于等于父节点的值,小根堆要求每个节点的值大于等于父节点的值
  1、父节点 list[i] 左节点 list[2i+1] 右节点 list[2i+2]
  2、大根堆 list[i] >= list[2i+1] && list[i] >= list[2i+2]
  3、小根堆 list[i] <= list[2i+1] && list[i] <= list[2i+2]
在堆的数据结构中,堆中的最大值总是位于根节点(在优先队列中使用堆的话堆中的最小值位于根节点)。堆中定义以下几种操作:

  1、最大堆调整(Max Heapify):将堆的末端子节点作调整,使得子节点永远小于父节点

  2、创建最大堆(Build Max Heap):将堆中的所有数据重新排序

  3、堆排序(HeapSort):移除位在第一个数据的根节点,并做最大堆调整的递归运算

python实现算法:

# 将数据插入到已经建好的堆中
def heap_insert(data, index):
    # 如果当前数据比他的父节点大,则交换,再继续往上,与他的父节点比较
    root = int((index - 1) / 2)
    while data[index] > data[root]:
        data[index], data[root] = data[root], data[index]
        index = root
        root = int((index - 1) / 2)

# 大根堆中一个数变小后,往下沉
def heapify(data, index, length):
    left = index * 2 + 1
    while left < length:
        right = left + 1
        # 比较当前节点的左右子节点,找到最大的那个下标
        larger = right if (right < length and data[right] > data[left]) else left
        # 比较当前节点和子节点中最大的那个,找到大的那个的下标
        larger = larger if data[larger] > data[index] else index
        # 如果当前节点和最大的那个节点数相同,则不需要做任何操作
        if larger == index: break
        # 当前节点和左右节点的最大的那个交换
        data[larger], data[index] = data[index], data[larger]
        # 当前节点指向最大那个节点,再继续判断
        index = larger
        left = index * 2 + 1

def heapsort(data):
    size = len(data)
    if not data or size < 2:
        return data
    # 创建大根堆
    for i in range(size):
        heap_insert(data, i)

    size -= 1
    # 然后再调整堆为大根堆
    while size > 0:
        data[0], data[size] = data[size], data[0]
        heapify(data, 0, size)
        size -= 1
    return data
#产生随机列表
def random_data():
    import random
    res = []
    for i in range(random.randint(1, 100)):
        res.append(random.randint(1, 100))
    return res

#对数器
def compare(src, res):
    data = sorted(src)
    if len(data) == len(src):
        for i in range(len(data)):
            if data[i] != res[i]:
                return False
        return True


if __name__ == '__main__':
    for i in range(100000):
        src = random_data()
        des = heapsort(src)
        if not compare(src, des):
            print(src)

 

标签:index,list,大话,larger,堆排序,排序,data,节点,size
来源: https://www.cnblogs.com/imlifelong/p/10653021.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有