python算法(七)堆排序

news/2024/5/19 5:30:36 标签: python, 堆排序, 大顶堆/小顶堆

python_0">python算法(七)堆排序

在这里插入图片描述
如上图, 一个堆应该满足所有的子节点都 不大于(不小于)父节点.
当子节点不大于父节点的时候,称为大顶堆
当子节点不小于父节点的时候,称为小顶堆
堆是一个概念上的名词,在实际的程序中,堆是以列表的形式存在的.
因此,如上的堆对应的列表是60 40 32 20 35 45 20 15 10 5 21 25 42 43

堆排序图示

1.首先要将乱序的列表,排列成堆
原始列表: 2 4 8 3 6 1
排列成堆状图:
在这里插入图片描述
4 < 6
调整成
在这里插入图片描述
2<6<8
调整成
在这里插入图片描述
相应列表: 8 6 2 3 4 1
2. 将堆的根节点与最后一个元素互换位置
1 6 2 3 4 8
然后去掉最后一个元素
重新按上面的步骤,重新排堆,换位置,去掉元素再排堆
直到最后一上元素

代码实现

python">from random import shuffle
def big_endian(num_list, start, end):
   root = start  # 设置根节点
   child = 2 * root + 1 # 左子节点
   
   # 循环直到没子节点的元素为止
   while child <= end:
        # 比较左右两个子节点的大小,以便与父节点比较
        if child + 1 <= end and num_list[child] < num_list[child + 1]:
           child += 1
           
        # 如果子节点更大,交换父子节点的位置 
        if num_list[root] < num_list[child]:
            num_list[root], num_list[child] = num_list[child], num_list[root]
            # 交换好子节点,会破坏下层节点的堆状,要重新调整子节点的堆装
            root = child
            child = 2 * child + 1      
        else:
            # 如果没有破坏堆状,则继续退出
            break

def heap_sort(num_list):
    first=len(num_list)//2 - 1  # 从最后一个父节点开始构造大顶堆
    for start in range(first, -1, -1):
        big_endian(num_list, start, len(num_list)-1)
    # 不断去掉根节点,然后构造新的大顶堆 直到最到一个元素
    for end in range(len(num_list)-1, 0, -1):
        num_list[0], num_list[end] = num_list[end], num_list[0]
        big_endian(num_list, 0, end -1)
    return num_list

if __name__ == '__main__':
    num_list_demo = [x for x in range(10)]
    shuffle(num_list_demo)
    print(num_list_demo)
    heap_sort(num_list_demo)
    print(num_list_demo)
    

http://www.niftyadmin.cn/n/1653891.html

相关文章

20135304刘世鹏——信息安全系统设计基础第十一周总结

第八章 异常控制流 异常 异常是控制流中的突变&#xff0c;用来响应处理器状态中的某些变化。 异常处理 异常号&#xff1a;一些是有处理器的设计者分配&#xff08;包括被零除、缺页、存储器访问违例、断电及算数溢出&#xff09;其他由操作系统内核的设计者分配&#xff08;包…

Codeforces Round #114 (Div. 1) A. Wizards and Trolleybuses 物理题

A. Wizards and Trolleybuses Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/167/problem/A Description In some country live wizards. They love to ride trolleybuses. A city in this country has a trolleybus depot with n trolleyb…

python 算法(8) 两数和问题

python 算法(8) 两数和问题 问题 问题来自leecode: 问题描述: 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同…

__block的作用

__block 的标记告诉编译器&#xff0c;这个变量在 block 里面需要做特殊处理。 一般来说&#xff0c;在 block 中用的变量值是被复制过来的&#xff0c;所以对于变量本身的修改并不会影响这个变量的真实值。而当我们用 __block 标记的时候&#xff0c;表示在 block 中的修改对于…

LeetCode题解(2)两数相加

LeetCode题解(2)两数相加 问题 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外…

020--VS2013 C++ 键盘消息处理

#include "MainClass.h" #define WINDOW_WIDTH 640 //为窗口宽度定义的宏,以方便在此处修改窗口宽度#define WINDOW_HEIGHT 480 //为窗口高度定义的宏,以方便在此处修改窗口高度#define WINDOW_TITLE "游戏开发的梦想" //为窗口标题定义的宏 //全局变量HBI…

SQL 循环语句

一、if语句 二、while语句 练习&#xff1a; 三、case when 四、练习 1、 2、 3、 4、 转载于:https://www.cnblogs.com/huluobozu/p/4994260.html

判断用户短时间内发送太多消息

判断用户短时间内发送消息太多 看到这个问题时&#xff0c;我想到了定时器&#xff0c;首先定义一个变量numberOfSend保存发送次数&#xff0c;然后在第一次输入时开启定时器timer1&#xff0c;5s之内如果numberOfSend没有超过8条&#xff0c;就在5s后重置numberOfSend&#xf…