博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 堆排序
阅读量:4312 次
发布时间:2019-06-06

本文共 1140 字,大约阅读时间需要 3 分钟。

  原本想写一篇关于堆排序的详细教程的,发现自己不会画图,QAQ。而且也不一定会画的比别人好看多少,尴尬的我上我的代码把。

我简单的说一下思路:我们构建的堆结构是逻辑结构。如果列表需要升序排列就构建一个大顶堆,降序就小顶堆。大顶堆的定义是该节点比其左右子节点都大,小顶堆相反。第一步构建完大顶堆,堆顶元素就是列表中最大元素,第二步把堆顶元素和第一个元素交换位置,第三步再调整成大顶堆,循环第二步和第三步。直到列表有序。堆排序是不稳定的(不稳定:不保证列表中两个相等的数的前后位置在排序后和排序前一样)。

1 import math 2  3  4 def sort(arr): 5     # 构建大顶堆, math.floor(), 向下取整, 因为构建大顶堆是从最后一个非叶子节点开始的 6     for i in range(math.floor(len(arr) / 2) - 1, -1, -1): 7         adjust_heap(arr, i, len(arr)) 8     # 调整 和 把堆顶这个最大数和最后一个数交换 9     for i in range(len(arr) - 1, 0, -1):10         arr[i], arr[0] = arr[0], arr[i]11         adjust_heap(arr, 0, i)12 13 14 def adjust_heap(arr, i, length):15     '''16     调整,每一次传过来的 i 节点及其子节点调整成大顶堆,17     如果不调其子节点有可能导致其子节点不是一个大顶堆18     '''19     temp = arr[i]20     k = 2 * i + 121     while k < length:22         if k + 1 < length and arr[k] < arr[k + 1]:23             k += 124         if arr[k] > temp:25             arr[i] = arr[k]26             i = k27         k = k * 2 + 128     arr[i] = temp29 30 31 test_list = [9, 8, 7, 6, 5, 4, 8, 2, 1]32 sort(test_list)33 print(test_list)

 这一篇文章教的挺详细的,大家不懂的可以看一看。

转载于:https://www.cnblogs.com/JulyShine/p/10181668.html

你可能感兴趣的文章
HTTP协议
查看>>
HTTPS
查看>>
git add . git add -u git add -A区别
查看>>
apache下虚拟域名配置
查看>>
session和cookie区别与联系
查看>>
PHP 实现笛卡尔积
查看>>
Laravel中的$loop
查看>>
CentOS7 重置root密码
查看>>
Centos安装Python3
查看>>
PHP批量插入
查看>>
laravel连接sql server 2008
查看>>
Laravel框架学习笔记之任务调度(定时任务)
查看>>
laravel 定时任务秒级执行
查看>>
浅析 Laravel 官方文档推荐的 Nginx 配置
查看>>
Swagger在Laravel项目中的使用
查看>>
Laravel 的生命周期
查看>>
CentOS Docker 安装
查看>>
Nginx
查看>>
Navicat远程连接云主机数据库
查看>>
Nginx配置文件nginx.conf中文详解(总结)
查看>>