• python3 堆排序


    思路:

    1.建立堆

    2.得到堆顶元素,为最大元素

    3.去掉堆顶,将堆最后一个元素放到堆顶,此时可通过一次调整重新使堆有序。

    4.堆顶元素为第二大元素。

    5.重复步骤3,直到堆变空。

    动画

    代码:

    def sift(data, low, high):
        i = low      # 父节点
        j = 2 * i + 1   # 左子节点
        tmp = data[i]   # 父节点值
        while j <= high:    # 子节点在节点中
            if j < high and data[j] > data[j + 1]:  # 有右子节点且右节点比父节点值大
                j += 1
            if tmp > data[j]:
                data[i] = data[j]   # 将父节点替换成新的子节点的值
                i = j   # 变成新的父节点
                j = 2 * i + 1   # 新的子节点
            else:
                break
        data[i] = tmp   # 将替换的父节点值赋给最终的父节点
    
    
    def heap_sort(data):
        n = len(data)
        # 创建堆
        for i in range(n//2-1, -1, -1):
            sift(data, i, n-1)
    
        # 挨个出数
        for i in range(n-1, -1, -1):    # 从大到小
            data[0], data[i] = data[i], data[0]     # 将最后一个值与父节点交互位置
            sift(data, 0, i-1)
    
    
    li = list(range(10))
    random.shuffle(li)
    print(li)
    heap_sort(li)
    print(li)

    实例:

    将列表内的数据以id的值从小到大排序

    def random_list(n):
        '''
        生成随机数据
        :param n: 
        :return: 
        '''
        ret = []
        a1 = ['', '', '', '', '', '', '', '', '']
        a2 = ['', '', '', '', '', '', '', '', '', '']
        a3 = ['', '', '', '', '', '', '', '', '', '']
        ids = range(1001, 1001 + n)
        for i in range(n):
            name = random.choice(a1) + random.choice(a2) + random.choice(a3)
            age = random.randint(18, 60)
            dic = {'id': ids[i], 'name': name, 'age': age}
            ret.append(dic)
        return ret
    
    
    def sift(data, low, high):
        i = low      # 父节点
        j = 2 * i + 1   # 左子节点
        tmp = data[i]   # 父节点值
        while j <= high:    # 子节点在节点中
            if j < high and data[j]['id'] < data[j + 1]['id']:  # 有右子节点且右节点比父节点值大
                j += 1
            if tmp['id'] < data[j]['id']:
                data[i] = data[j]   # 将父节点替换成新的子节点的值
                i = j   # 变成新的父节点
                j = 2 * i + 1   # 新的子节点
            else:
                break
        data[i] = tmp   # 将替换的父节点值赋给最终的父节点
    
    
    def heap_sort(data):
        n = len(data)
        # 创建堆
        for i in range(n//2-1, -1, -1):
            sift(data, i, n-1)
    
        # 挨个出数
        for i in range(n-1, -1, -1):    # 从大到小
            data[0], data[i] = data[i], data[0]     # 将最后一个值与父节点交互位置
            sift(data, 0, i-1)
    
    li = random_list(1000) # 生成数据
    random.shuffle(li) # 将数据打乱
    heap_sort(li)
    print(li)
  • 相关阅读:
    两个链表的第一个公共节点
    笔试题总结
    SMTP协议分析
    用两个栈实现一个队列
    医院Android项目总结
    C标准I/O库函数与Unbuffered I/O函数
    ELF文件
    x86汇编程序基础(AT&T语法)
    【转】Linux C动态内存泄漏追踪方法
    Minor【 PHP框架】6.代理
  • 原文地址:https://www.cnblogs.com/bingabcd/p/7425039.html
Copyright © 2020-2023  润新知