终于搞明白堆排序了,汗一个
先上代码:
def heapify(a, idx, size)
left_idx = 2 * idx + 1
right_idx = 2 * idx + 2
bigger_idx = idx
bigger_idx = left_idx if left_idx < size && a[left_idx] > a[idx]
bigger_idx = right_idx if right_idx < size && a[right_idx] > a[bigger_idx]
if bigger_idx != idx
a[idx], a[bigger_idx] = a[bigger_idx], a[idx]
heapify(a, bigger_idx, size)
end
end
def build_heap(a)
last_parent_idx = a.length / 2 - 1
i = last_parent_idx
while i >= 0
heapify(a, i, a.size)
i = i - 1
end
end
def heap_sort(a)
return a if a.size <= 1
size = a.size
build_heap(a)
while size > 0
a[0], a[size-1] = a[size-1], a[0]
size = size - 1
heapify(a, 0, size)
end
return a
end
a = [1,5,3,6,4,3,2,7,9,0,8,0,10]
p heap_sort(a)
算法原理:
利用二叉树,先将一个数组构建成一个“最大堆”,保证对每个节点i,它的相邻子节点left和right都<=i
这时根节点就是最大的数,将它和最后一个节点互换位置
然后从根节点开始与相邻的子节点比较大小,如果left或right比它大,则互换位置,称为“下移”,直到第n-1个节点,这一轮“下移”之后根节点成为除了最后一个节点之外最大的数,将它和倒数第二个节点互换位置
。。。
循环直到所有节点做完“下移”操作,这时数组已经从小到大排好序了
关键:
有两点:
1,先构建“最大堆”,从最后一个节点的父节点开始做“下移”,直到根节点
2,每次“下移”结束后不能将最大值根节点从数组中删除,只能跟最后一个节点互换位置,这样是为了保证二叉树的结构不变,即还是一个“最大堆”,所以堆排序又称为“in place sort”
时间复杂度:
一个长度为n的数组,用二叉树来表示的话共有lgn层
对节点i,比较它相邻的left节点和right节点并做“下移”操作的时间为Θ(1)
可以用数学归纳法来证明heapsort的时间复杂度为Θ(nlogn)
1,初始化构建“最大堆”的时间为O(nlgn),不影响结果(实际上为O(n))
2,可以知道对n=3,6,f(n) < nlgn,
而f(2n) = f(n) + nlg(2n)
< nlgn + n(1+lgn)
= 2nlgn + n
< 2n(lgn + 1)
= 2nlg2n
所以fn = Θ(nlgn)
分享到:
相关推荐
CLRS 最后,要拿 LeetCode,Python 可以让你专注于想法,而 CLRS 真的有点乏味,所以每当你读完时,你就会感到很高兴,因为你可以做 LeetCode。 :books: :open_book: :pencil: :notebook: :hamburger: :spaghetti: :...
算法简介第3版 托马斯·科门(Thomas H.Cormen) 查尔斯·莱森(Charles E.Leiserson) 罗纳德·里维斯特(Ronald Rivest) 克利福德·斯坦
CLRS教材练习算法关于该项目重点在于通过在代码中实现对基本和高级数据结构及算法的掌握。 这主要是在Python中完成的。促成主题分叉项目创建功能分支( git checkout -b feature/AmazingFeature ) 提交更改( git ...
CLRS(Introduction.to.Algorithms.Second.Edition)
CLRS英文第二版 .
clrs-notes-solutions, 算法导论,第3版,学习笔记,习题答案
一个个人帮助页面,用于准备数据结构和算法,重点是CLRS书籍... /src目录是添加各种算法的实现的位置。 该README.md文件用于列出数据结构和算法,而不一定来自本书。 快速浏览 目录 Sl。 话题 1。 :check_box_...
CLRS CLRS 代码
在有关算法的书中,有一些叙述非常严谨,但不够全面;另一些涉及了大量的题材,但又缺乏严谨性。《算法导论(原书第3版)》将严谨性和全面性融为一体,深入讨论各类算法,并着力使这些算法的设计和分析能为各个层次的...
大名鼎鼎的 CLRS Algorithm Introduction 算法导论 课后大部分的题目解答
算法导论 CLRS Mit Press - Introduction To Algorithms 2Nd Edition Incl Exercises Edition.chm
指《算法导论》(Introduction to Algorithms)。 由Thomas H. Cormen,Charles E. Leiserson,Ronald L. Rivest,Clifford Stein编写,MIT出版的一本介绍、分析当代计算机...用四位作者姓的首字母组成的CLRS代表此书。
算法导论 CLRS 英文第三版 算法导论 CLRS 英文第三版
CLRS CLRS示例代码的C ++实现和研究目的。 不涉及编码的练习将不会共享。
CLRS Problems 15-5 的解法
clrs CLRS算法的实现
MIT算法分析教材CLRS的教师手册,内有课程精讲及习题答案
算法导论CLRS 英文第3版 pdf 是算法方面的经典著作
堆排序 快速排序 计数排序 基数排序 桶排序 算法: 最大子数组(递归,不是最优的) kadane 算法(最优最大子阵列算法) 最小最大 第 k 个号码(选择) 杆切割 最长公共子序列 最长递增子序列 常见问题的解决...
algorithms from CLRS "Introduction to Algorithms 3rd" implementation in C++ templates. 《算法导论》第三版 C++泛型实现