堆排序简介.ppt
- 格式:ppt
- 大小:321.50 KB
- 文档页数:20
纸上谈兵:堆(heap)堆(heap)⼜被为优先队列(priority queue)。
尽管名为优先队列,但堆并不是队列。
回忆⼀下,在中,我们可以进⾏的限定操作是dequeue和enqueue。
dequeue是按照进⼊队列的先后顺序来取出元素。
⽽在堆中,我们不是按照元素进⼊队列的先后顺序取出元素的,⽽是按照元素的优先级取出元素。
这就好像候机的时候,⽆论谁先到达候机厅,总是头等舱的乘客先登机,然后是商务舱的乘客,最后是经济舱的乘客。
每个乘客都有头等舱、商务舱、经济舱三种个键值(key)中的⼀个。
头等舱->商务舱->经济舱依次享有从⾼到低的优先级。
再⽐如,封建社会的等级制度,也是⼀个堆。
在这个堆中,国王、贵族、骑⼠和农民是从⾼到低的优先级。
封建等级Linux内核中的调度器(scheduler)会按照各个进程的优先级来安排CPU执⾏哪⼀个进程。
计算机中通常有多个进程,每个进程有不同的优先级(该优先级的计算会综合多个因素,⽐如进程所需要耗费的时间,进程已经等待的时间,⽤户的优先级,⽤户设定的进程优先程度等等)。
内核会找到优先级最⾼的进程,并执⾏。
如果有优先级更⾼的进程被提交,那么调度器会转⽽安排该进程运⾏。
优先级⽐较低的进程则会等待。
“堆”是实现调度器的理想数据结构。
(Linux中可以使⽤nice命令来影响进程的优先级)堆的实现堆的⼀个经典的实现是完全⼆叉树(complete binary tree)。
这样实现的堆成为⼆叉堆(binary heap)。
完全⼆叉树是增加了限定条件的⼆叉树。
假设⼀个⼆叉树的深度为n。
为了满⾜完全⼆叉树的要求,该⼆叉树的前n-1层必须填满,第n层也必须按照从左到右的顺序被填满,⽐如下图:为了实现堆的操作,我们额外增加⼀个要求: 任意节点的优先级不⼩于它的⼦节点。
如果在上图中,设定⼩的元素值享有⾼的优先级,那么上图就符合该要求。
这类似于“叠罗汉”。
叠罗汉最重要的⼀点,就是让体重⼤的参与者站在最下⾯,让体重⼩的参与者站在上⾯ (体重⼩,优先级⾼)。
堆排序的筛选方法堆排序是一种常见的排序算法,它利用完全二叉树的性质来进行排序。
堆其实就是一个满足特定条件的完全二叉树,它分为最大堆和最小堆两种类型。
在堆排序中,我们需要先构建一个堆,然后逐步将堆顶元素与末尾元素交换,并对剩余的部分重新调整成一个堆,直到整个数组有序。
堆排序的筛选方法是指在构建和调整堆的过程中所采用的方法,它包括构建堆的过程和调整堆的过程。
堆排序的筛选方法主要包括两个部分:构建堆和调整堆。
一、构建堆1. 自底向上构建堆:首先从最后一个非叶子节点开始,依次对每个非叶子节点进行调整,使得以该节点为根的子树成为一个堆。
这样可以保证每个子树都是堆,最终整个数组就构成了一个堆。
2. 自顶向下构建堆:从根节点开始,依次对每个节点进行调整,使得以该节点为根的子树成为一个堆。
这种方法比较直观,但效率较低,因为需要对每个节点进行逐个调整。
二、调整堆1. 自顶向下调整堆:当堆顶元素发生变化时,需要对整个堆进行调整,保证堆的性质。
自顶向下调整堆的方法是将根节点与其子节点进行比较,并根据需要进行交换,然后递归地对子节点进行调整。
2. 自底向上调整堆:当堆的某个非叶子节点发生变化时,需要对堆进行调整。
自底向上调整堆的方法是将父节点与其子节点进行比较,并根据需要进行交换,然后递归地对父节点进行调整。
在实际应用中,通常采用自底向上构建堆和自顶向下调整堆的方法,这样可以保证效率和性能的平衡。
堆排序的筛选方法是堆排序算法中非常重要的一部分,它直接影响了算法的效率和性能。
在实现堆排序算法时,需要充分考虑筛选方法的选择,以达到最佳的排序效果。
堆排序的筛选方法是构建和调整堆的关键步骤,它包括构建堆和调整堆两个部分。
在实际应用中,需要根据具体情况选择合适的筛选方法,以确保排序算法的效率和性能。
集合的排序方法集合是计算机科学的一个重要概念,在程序设计中有着广泛的应用。
集合的排序是对集合中元素按一定顺序排列的过程,是解决复杂问题的重要方法。
本文将介绍几种常用的集合排序方法,包括桶排序、基数排序、归并排序、快速排序、堆排序、穷举法排序等。
首先介绍桶排序。
桶排序是一种时间复杂度为O(n)的非稳定性排序方法,属于分治思想,将集合中的元素放入桶中,再对每个桶进行排序,最后将桶中的元素输出,即可得到有序的序列。
桶排序的优点是算法简单,适用于数据量较小的排序,缺点在于桶的分配较为困难,容易出现内存碎片的问题。
其次介绍基数排序。
基数排序是一种时间复杂度为O(n)的稳定性排序方法。
该排序方法是将集合中的元素按照每一位数字上的大小排列,最终得到有序的序列。
其优点在于算法简单,排序效率高。
缺点在于数据规模大时需要耗费大量的空间和内存,而且只能排序非负整数。
接下来介绍归并排序。
归并排序是一种时间复杂度为O(nlogn)的稳定性排序方法。
该排序方法是将集合中的元素分成两部分,分别排序,再将两个有序的子序列合并成一个序列,最终得到有序的序列。
其优点在于时间复杂度较低,算法稳定,排序结果可靠。
缺点在于需要额外的内存空间,数据规模较小时不一定比插入排序出色。
然后介绍快速排序。
快速排序是一种时间复杂度为O(nlogn)的不稳定性排序方法。
该排序方法是通过选定一个基准元素,将集合中的元素分成两部分,使小于基准元素的放在左边,大于等于基准元素的放在右边,再递归的对左右子序列分别排序,最终得到有序的序列。
其优点在于算法速度快,缺点在于容易出现划分不均衡的情况,时间复杂度也较高。
再接下来介绍堆排序。
堆排序是一种时间复杂度为O(nlogn)的不稳定性排序方法。
该排序方法是通过将集合中的元素构造成一个大顶堆,将堆顶元素和最后一个元素交换,然后将剩余n-1个元素重新构造成大顶堆,重复上述过程,最终得到有序的序列。
其优点在于算法速度快,不需要额外的内存空间,缺点在于代码实现较为复杂,不适合处理小规模的集合。