00 理解
- 堆排序:利用堆的数学规律,直接通过数组下标就可以实现的复杂(非)思想排序过程。T低O也低,大神创造,你值得拥有!
- 堆的数学规律1:父子之间的下标存在规律,这就类似于链表指来指去的指针,树的结构得以数组下标方便实现。
- 堆的数学规律2:堆的顶端又可以作为筛选结果,层层选拔,排序就完成了。毕竟排序说穿了,就是在若干数里面不断选出极值,再筛选得最值,有了“最”就有了大小关系,因此序也就出来了。
- 特点:初看起来高大上,但是并不涉及高深的数学思想,理解一下就觉得简单了!
----------------------------以大根堆为例------------------------------
01建堆
过程描述:从下往上,层层选拔当前人字结构的大值当爸爸
- 为啥要建堆!!!
如0的第二、三点说的,建堆完成后,得到了:
1)最值(N个数中的)
2)大根树结构 - 然后呢???
1)有了最值就得到了排序结果的第一个值,距离成功进了一步
2)大根树的严密结构为革命的胜利奠定了基础!【这里连接到02调整的第1点】
02调整
过程描述:最值和数组最后一位交换位置,从上往下选爸爸(这个最后一位基本又被踢下去了)
-
交换是???
根在第一位,作为被已经选出来的这一位,改放在尾部可以更好的管理剩余的,需要排序的N-1个元素,也节约了位置,实现了原地排序。 -
为啥有第二步调整堆,直接每次对换后重复建堆,不是都可以得到一个最值吗?
我们可以大致看到,相比需要用for遍历2次的一些其他算法,本算法除了第一次兴师动众全部比较了一次后,调换仅仅导致了根结构的局部变动,所以不需要再次建堆那么麻烦,调整堆更加轻松简单!
结语:堆排序记减记:
- 从下往上,层层选拔,爸爸就是你爸爸
- 垃圾上位,一路跌破,新爸爸得以登基