堆排序

合集下载

常用排序方法以及具体解释排序原理

常用排序方法以及具体解释排序原理

常用排序方法以及具体解释排序原理常用排序方法以及具体解释排序原理排序是计算机科学中的重要概念之一,它在很多领域得到广泛应用,例如搜索引擎、数据库、图像处理等等。

排序的目的是把一组数据按照一定的规则进行排列,使之更加有序和易于处理。

在计算机领域,目前有很多种排序方法,下面我们将介绍其中几种常用的排序方法以及它们的具体原理。

一、冒泡排序冒泡排序是一种简单的排序算法,它的原理是不断比较相邻的两个元素,如果顺序不符合规定就交换它们的位置,这样一步步地就能够把整个序列排好序。

冒泡排序的时间复杂度为O(n²)。

二、插入排序插入排序是一种直接插入排序,它的基本思想是把待排序的数据分为已排序和未排序两部分,每次取出未排序的第一个元素插入到已排序的正确位置上。

插入排序的时间复杂度也为O(n²)。

三、选择排序选择排序是一种简单选择排序,它的原理是不断地选出最小的元素并将它放在第一个位置,再从剩下的元素中选出最小的放在第二个位置,以此类推,直到全部排完。

选择排序的时间复杂度也为O(n²)。

四、快速排序快速排序是一种基于分治思想的排序算法,它的核心思想是选取一个轴数,把数列分为两部分,并且分别对这两部分再进行递归,分治的过程就是不断地把数列分解成更小的数列,直到每个数列只有一个元素,这时就排序完成了。

快速排序的时间复杂度为O(nlogn)。

五、归并排序归并排序是一种基于分治思想的排序算法,它的核心思想是把一个数列分成两个子数列,然后对这两个子数列进行递归排序,最后将这两个有序的子数列合并成一个有序的序列。

归并排序的时间复杂度也为O(nlogn)。

六、堆排序堆排序是一种利用堆的数据结构来进行排序的算法,堆是一种完全二叉树,它有着以下两个性质:1.任意节点的值大于(或小于)它的所有子节点;2.它是一棵完全二叉树。

堆排序的原理是先把数列建成一个最大堆,然后不断从堆顶取出最大的元素放到数列的末尾,并重新调整堆,直到数列排好序。

10大排序方法

10大排序方法

10大排序方法10大排序方法在计算机科学和数据处理中,排序是一项基础且重要的任务。

通过排序,我们可以将一组数据按照特定规则进行排列,使得数据更易于查找和分析。

下面介绍了10种常用的排序方法,它们在不同场景下具有不同的优势和适用性。

1. 冒泡排序(Bubble Sort)冒泡排序是一种简单而直观的排序算法,它通过重复地比较相邻元素并交换位置来实现排序。

该算法的核心思想是将较大的元素逐渐“冒泡”到数列的末尾。

2. 选择排序(Selection Sort)选择排序的思想是从待排序的数据中选择出最小(或最大)的元素,放在已排序序列的末尾。

该过程不断重复,直到所有元素排序完成。

3. 插入排序(Insertion Sort)插入排序是一种简单且高效的排序算法,它的基本思想是将待排序数据分为已排序和未排序两部分,每次从未排序数据中取出一个元素,将其插入到已排序数据的合适位置。

希尔排序是插入排序的改进版本,它通过使用不同的间隔序列对数据进行多次分组排序,最终实现整体有序。

希尔排序在处理中等大小的数据集时具有较好的性能。

5. 归并排序(Merge Sort)归并排序是一种分治法的典型应用,它将待排序数据不断地分割成小块,然后逐步合并这些小块,以得到完整的有序序列。

归并排序在处理大规模数据时具有较好的稳定性和效率。

6. 快速排序(Quick Sort)快速排序是一种高效的排序算法,它采用分治的思想,通过选取一个基准元素将数据分为左右两部分,并分别对左右两部分进行排序。

快速排序通常是性能最好的排序算法之一。

7. 堆排序(Heap Sort)堆排序是利用堆这种数据结构的一种排序算法。

它通过建立最大(或最小)堆,并不断从堆顶取出最大(或最小)元素,实现排序的过程。

堆排序在处理大规模数据时具有较好的性能。

8. 计数排序(Counting Sort)计数排序是一种非比较性的排序算法,适用于数据范围较小且取值离散的情况。

计数排序通过统计每个元素出现的次数,从而确定每个元素在有序序列中的位置。

二叉堆和优先队列高效实现堆排序和Dijkstra算法

二叉堆和优先队列高效实现堆排序和Dijkstra算法

二叉堆和优先队列高效实现堆排序和Dijkstra算法堆排序和Dijkstra算法是计算机科学中常见且高效的算法。

它们的实现中常用到二叉堆和优先队列的数据结构。

本文将介绍二叉堆和优先队列的概念,以及它们在堆排序和Dijkstra算法中的应用。

一、二叉堆二叉堆是一种特殊的完全二叉树,满足以下两个性质:1. 结构性质:除最后一层外,每一层都是满的,最后一层从左到右填入节点。

2. 堆序性质:对于任意节点i,其父节点值小于等于其子节点的值。

二叉堆有两种类型:大顶堆和小顶堆。

大顶堆中,父节点的值大于等于其子节点;小顶堆中,父节点的值小于等于其子节点。

二叉堆的根节点即堆中的最值。

二、优先队列优先队列是一种可以快速访问和删除最值元素的数据结构。

它支持两个主要操作:1. 插入操作:将元素按照一定的优先级插入队列中。

2. 弹出操作:弹出队列中的最值元素。

优先队列可以用二叉堆实现,其中小顶堆用于实现最小优先队列,大顶堆用于实现最大优先队列。

通过保持堆序性质,我们可以在O(logn)的时间复杂度内完成插入和弹出的操作。

三、堆排序堆排序是一种高效的排序算法,基于二叉堆数据结构。

其主要步骤如下:1. 构建最大堆:将待排序序列构建成一个最大堆。

2. 交换堆顶元素和最后一个元素:将最大堆的堆顶元素与最后一个元素交换,此时最大值被固定在了最后。

3. 调整堆:调整剩余元素构建一个新的最大堆。

4. 重复步骤2和步骤3,直到剩余元素只有一个。

堆排序的时间复杂度为O(nlogn),且具有原地排序的优点,但是不稳定。

四、Dijkstra算法Dijkstra算法是一种解决单源最短路径问题的贪心算法。

其核心思想是利用优先队列选择当前最短路径的顶点来遍历附近的节点,并更新到达这些节点的最短距离。

其主要步骤如下:1. 创建一个距离数组dist,存储源点到每个顶点的最短距离。

初始时,源点到自身的距离为0,其他顶点的距离为无穷大。

2. 将源点插入到优先队列中。

关于堆排序、归并排序、快速排序的比较

关于堆排序、归并排序、快速排序的比较

关于堆排序、归并排序、快速排序的⽐较时间复杂度:堆排序归并排序快速排序最坏时间 O(nlogn) O(nlogn) O(n^2)最好时间 O(nlogn) O(nlogn) O(nlogn)平均时间 O(nlogn) O(nlogn) O(nlogn)辅助空间 O(1) O(n) O(logn)~O(n)从时间复杂度看堆排序最好有⼈说代码实现后,数据量⾜够⼤的时候,快速排序的时间确实是⽐堆排序短解释是,对于数组,快速排序每下⼀次寻址都是紧挨当前地址的,⽽堆排序的下⼀次寻址和当前地址的距离⽐较长。

⽹友解答:1#4种⾮平⽅级的排序:希尔排序,堆排序,归并排序,快速排序我测试的平均排序时间:数据是随机整数,时间单位是秒数据规模快速排序归并排序希尔排序堆排序1000万 0.75 1.22 1.77 3.575000万 3.78 6.29 9.48 26.541亿 7.65 13.06 18.79 61.31堆排序是最差的。

这是算法硬伤,没办法的。

因为每次取⼀个最⼤值和堆底部的数据(记为X)交换,重新筛选堆,把堆顶的X调整到位,有很⼤可能是依旧调整到堆的底部(堆的底部X显然是⽐较⼩的数,才会在底部),然后再次和堆顶最⼤值交换,再调整下来。

从上⾯看出,堆排序做了许多⽆⽤功。

⾄于快速排序为啥⽐归并排序快,我说不清楚。

2#算法复杂度⼀样只是说明随着数据量的增加,算法时间代价增长的趋势相同,并不是执⾏的时间就⼀样,这⾥⾯有很多常量参数的差别,即使是同样的算法,不同的⼈写的代码,不同的应⽤场景下执⾏时间也可能差别很⼤。

快排的最坏时间虽然复杂度⾼,但是在统计意义上,这种数据出现的概率极⼩,⽽堆排序过程⾥的交换跟快排过程⾥的交换虽然都是常量时间,但是常量时间差很多。

3#请问你的快快速排序是怎么写的,我写的快速排序,当测试数组⼤于5000的时候就栈溢出了。

其他的⼏个排序都对着,不过他们呢没有⽤栈。

这是快速排序的代码,win7 32位,vs2010.1int FindPos(double *p,int low,int high)2 {3double val = p[low];4while (low<high)5 {6while(low<high&&p[high]>=val)7 high--;8 p[low]=p[high];9while(low<high&&p[low]<val)10 low++;11 p[high]=p[low];12 }13 p[low]=val;14return low;15 }16void QuickSort(double *a,int low,int high)17 {18if (!a||high<low)19return;2021if (low<high)22 {23int pos=FindPos(a,low,high);24 QuickSort(a,low,pos-1);25 QuickSort(a,pos+1,high);26 }27 }……7#谁说的快排好啊?我⼀般都⽤堆的,我认为堆好。

排序方法有哪些

排序方法有哪些

排序方法有哪些在日常生活和工作中,我们经常需要对一些事物或者数据进行排序。

排序是将一组数据按照一定的规则进行排列的过程,它可以帮助我们更清晰地了解事物之间的关系,找到最合适的解决方案。

在实际操作中,有许多不同的排序方法可以使用,每种方法都有其特点和适用场景。

下面将介绍一些常见的排序方法。

1. 冒泡排序。

冒泡排序是一种简单的排序算法,它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。

重复这个过程直到整个数列有序。

冒泡排序的时间复杂度为O(n^2),在数据量较小的情况下比较实用。

2. 选择排序。

选择排序是一种简单直观的排序算法,它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

选择排序的时间复杂度也为O(n^2),但由于不涉及交换操作,所以相对于冒泡排序来说性能上会更好一些。

3. 插入排序。

插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

插入排序的时间复杂度也为O(n^2),但是在实际应用中,当数据规模较小时,插入排序会比选择排序和冒泡排序更加高效。

4. 快速排序。

快速排序是一种分治的排序算法,它的基本思想是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

快速排序的时间复杂度为O(nlogn),在大多数情况下都比前面介绍的排序方法要快。

5. 归并排序。

归并排序是一种稳定的排序算法,它的基本思想是将两个有序的子序列合并成一个有序序列。

归并排序的时间复杂度也为O(nlogn),并且由于其稳定性和适用于大规模数据的特点,因此在实际应用中得到了广泛的应用。

6. 堆排序。

堆排序是一种树形选择排序,它的基本思想是利用堆这种数据结构来进行排序。

最快排序方法

最快排序方法

最快排序方法最快的排序方法是一种常见的计算机算法问题。

在计算机科学领域,有许多不同的排序算法可供选择,每种算法都有其自身的优势和限制。

1. 快速排序(Quicksort):快速排序是一种基于分治法的排序算法,它通过将待排序的元素分割为较小和较大的两个子序列,然后递归地对这两个子序列进行排序。

它的平均时间复杂度为O(nlogn),在大多数情况下表现优秀。

然而,在最坏情况下,快速排序的时间复杂度可达到O(n^2),这通常发生在输入数据已经有序或几乎有序的情况下。

2. 归并排序(Merge Sort):归并排序也是一种基于分治法的排序算法,它将待排序的序列递归地分成较小的子序列,然后将这些子序列两两合并,直到最后只剩下一个有序序列。

它的平均和最坏情况下的时间复杂度都是O(nlogn),并且具有稳定性,即相等元素的相对顺序在排序后不会改变。

然而,归并排序需要额外的空间来存储临时数组,因此在空间复杂度方面可能不是最优选择。

3. 堆排序(Heapsort):堆排序是一种基于二叉堆数据结构的排序算法。

它利用堆的性质来进行排序,堆中的最大元素总是位于根节点。

堆排序的时间复杂度为O(nlogn),并且不需要额外的空间,因此在空间复杂度方面具有优势。

然而,堆排序的常数因子比较大,因此在实际应用中可能不如快速排序和归并排序快。

4. 基数排序(Radix Sort):基数排序是一种非比较性的排序算法,它根据元素的位值将待排序的元素分配到不同的桶中,然后按照桶的顺序依次收集元素。

基数排序的时间复杂度为O(dn),其中d是元素的最大位数,n是元素的个数。

基数排序适用于元素位数较小且范围已知的情况,例如整数排序。

然而,基数排序可能需要较多的额外空间,因此在空间复杂度方面可能不是最优选择。

5. 计数排序(Counting Sort):计数排序是一种非比较性的排序算法,它通过统计每个元素的出现次数来确定元素的相对顺序。

计数排序的时间复杂度为O(n+k),其中n是元素的个数,k是元素的范围。

数组排序算法与时间复杂度分析

数组排序算法与时间复杂度分析

数组排序算法与时间复杂度分析在计算机科学中,数组排序是一项基本的操作。

排序算法的目的是将一个无序的数组按照一定的规则重新排列,使得数组中的元素按照升序或降序排列。

在实际应用中,排序算法被广泛应用于数据处理、搜索和数据库等领域。

本文将介绍几种常见的数组排序算法,并分析它们的时间复杂度。

一、冒泡排序(Bubble Sort)冒泡排序是一种简单直观的排序算法,它重复地遍历数组,每次比较相邻的两个元素,如果顺序错误就交换它们。

通过多次遍历,将最大(或最小)的元素逐渐“冒泡”到数组的末尾。

冒泡排序的时间复杂度为O(n^2),其中n是数组的长度。

这是因为冒泡排序需要遍历n次数组,并且每次遍历需要比较n-1次相邻元素。

二、选择排序(Selection Sort)选择排序是一种简单直观的排序算法,它重复地从未排序的部分选择最小(或最大)的元素,将其放到已排序部分的末尾。

选择排序的时间复杂度也为O(n^2),因为它需要遍历n次数组,并且每次遍历需要比较n-1次未排序元素。

三、插入排序(Insertion Sort)插入排序是一种简单直观的排序算法,它将数组分为已排序和未排序两部分,每次从未排序部分选择一个元素插入到已排序部分的正确位置。

插入排序的时间复杂度为O(n^2),因为它需要遍历n次数组,并且每次遍历需要比较最多n-1次已排序元素。

四、快速排序(Quick Sort)快速排序是一种高效的排序算法,它采用分治法的思想。

首先选择一个基准元素,然后将数组分成两部分,使得左边的元素都小于基准元素,右边的元素都大于基准元素。

然后递归地对左右两部分进行快速排序。

快速排序的平均时间复杂度为O(nlogn),最坏情况下为O(n^2)。

这是因为在最坏情况下,每次选择的基准元素都是数组中的最大或最小元素,导致分割不均匀。

五、归并排序(Merge Sort)归并排序是一种稳定的排序算法,它采用分治法的思想。

将数组分成两部分,分别对左右两部分进行归并排序,然后将排序好的两个部分合并成一个有序的数组。

堆排序实例演示3

堆排序实例演示3

91
16
47
85
36
24
24 36 53 30
85 47 30 53
16
91
如果该序列是一个堆,则对应的这棵完全二叉树的特点是: 所有分支结点的值均不小于 (或不大于)其子女的值,即每棵子 树根结点的值是最大(或最小)的。
堆特点:堆顶元素是整个序列中最大(或最小)的元素。
2022/9/1
数据结构
2
2.堆排序
足堆,继续调 整。
将 堆 顶 元 素 R1 比根小,交换。
与Rn交换)。
2022/9/1
数据结构
d.到了叶子结 点,调整结束, 堆建成。
6
85
30
53
47
53
47
53
47
30
24 36 16 30
24 36 16 85
24 36 16 85
91
91
91
堆调整结束。
R1 与 Rn-1 交 换 , 堆被破坏。 对 R1 与 Rn-2 调 整。
16
b.调整结束后,以R4为 根的子树满足堆特性。 再将以R3结点为根的 子树调整为堆;
16
c. 以 R3为根的子树满足 堆特性。 再将以R2结点为根的子树 调整为堆;
30
91
91
47
91
47
30
47
85
24 36 53 85 16
24 36 53 85 16
24 36 53 30 16
以 R2 为 根 的 子 树 满 足 堆特性。 再 将 以 R1 结 点 为 根 的 子树调整为堆
d. 调整结束后,整棵树为堆。
建堆过程示例
❖ 例如,图中的完全二叉树表示一个有8个元素的无序序列: {49,38,65,97,76,13,27,49}(相同的两个关 键字49,其中后面一个用49表示),则构造堆的过程如 图3(b)~(f)所示。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

仍然通过对应的完全二叉树分析:对 n 个结点的完全二叉树, 可以认为:以叶子为根的子树(只有它自己)已满足堆特性,因 此从最后一个分支结点开始,把每棵子树调整为堆,直到根结点 为止,整棵树成为堆。 n 最后一个分支结点是第 个结点。 2
2015-3-22
数据结构
12
【例】建堆的过程: 设初始排序序列:30
2015-3-22 数据结构 18
5、性能分析: 设树高为k,由二叉树的性质知:k=log2n +1。 从根到叶的筛选,关键码比较次数至多为2(k-1) 次,移动记录至多k次。共n-1次。 因此堆排序最坏情况下,时间复杂度为O(nlog2n)。
2015-3-22
数据结构
19
表1几种内部排序方法的比较
10
4、堆排序的实现
初步的堆排序算法: 1、建成初始堆; 2、for (i=n;i>1;i--) { R[1]<=>R[i]; HeapAdjust(R,1,i-1); }
2015-3-22
数据结构
11
再讨论第一个问题:对原始排序表建初始堆的过程。
对原始序列建堆过程,就是一个反复进行筛选的过程。
30 24 16 47 a.8个结点的初始状态。 从R4结点开始调整; 36 85 53 91
24
85 16
36 53 91 47 ,建成大顶堆。
30 30 85 24 91 16
c. 以 R3 为根的子树满足 堆特性。 再将以 R2 结点为根的子树 调整为堆;
24 47 16 36
91 36 53
2015-3-22
数据结构
3
因此,实现堆排序需解决两个问题: 1. 如何将n个元素的排序序列按关键码建成堆(初始堆); 2. 怎样将剩余的n-1个元素按其关键码调整为一个新堆。
2015-3-22
数据结构
4
2. 怎样将剩余的n-1个元素按其关键码调整为一个新堆。 假设有一个大根堆,当输出堆顶元素(根结点)后,以堆 中最后一个元素替代它。此时根结点的左子树和右子树均为堆, 则只需自上而下进行调整即可。 首先将堆顶元素与其左、右子树根结点的值进行比较,如 果堆顶元素比它的两个子结点都大,则已经是堆;否则,让堆 顶元素与其中较大的孩子结点交换,先让堆顶满足堆的性质。 可能因为交换,使交换后的结点为根的子树不再满足堆的性质, 则重复向下调整,当调整使新的更小子树依旧满足堆的性质时, 重新建堆的过程结束。这种自上而下的建堆过程称为结点向下 的“筛选”。图2是一个大根堆的排序输出过程。
2015-3-22
c.右子树不满 d.到了叶子结 足堆,继续调 点,调整结束, 整。 堆建成。
数据结构
6
85
30
53
53 47 85 91 30 36 16 85
47
24 91 36
53
16 30 91 24
47 36
16
24
堆调整结束。
R1 与 Rn-1 交换 , 堆被破坏。 对 R1 与 Rn-2 调整。
2015-3-22
数据结构
5
91 47 24 16 36 85 53 30 91 24 47
16
85 36 53 30 91 24 47
85 16 36 53 30 24 47
85 53 36 16 30
91
a.初始堆
b.堆被破坏
输出堆顶元素 , 调整:根结点 再将最后一个 与左右子女较 元素放入堆顶 ( 为了操作简便, 大者比较,若 将 堆 顶 元 素 R1 比根小,交换。 与Rn交换)。
2015-3-22
数据结构
15
2015-3-22
数据结构
16
可见,初始建堆的过程也是反复筛选的过程. 借助于筛选算法,排序表建立初始堆的过程为: for (i=n/2;i>0;i--) HeapAdjust(R,i,n);
2015-3-22
数据结构
17
堆排序: 对n个元素的序列进行堆排序,先将其建成堆,以根结 点与第n个结点交换;调整前n-1个结点成为堆,再以根结点 与第n-1个结点交换;…;重复上述操作,直到整个序列有序。 堆排序算法 void HeapSort(datetype R[ ], int n) { /*将序列R[1]..R[n]按堆排序方法进行排序*/ for(i=n/2; i>0; i-- ) HeapAdjust(R, i, n); /*将序列R[1]..R[n]建成初始堆 */ for(i=n; i>1; i--) { R[0]=R[1]; /* 堆顶R[1]与堆底元素R[i]交换 */ R[1]=R[i]; R[i]=R[0]; HeapAdjust(R,1, i-1); /*将R[1]..R[i-1]重新调整为堆*/ } }
2015-3-22 数据结构 2
2.堆排序
堆特点:堆顶元素是整个序列中最大(或最小)的元素。 若将排序表按关键码建成堆,堆顶元素就是选择出的最 大元素(或最小),这样就得到n个元素中的第一个的元素。 然后,再对剩下的 n-1个元素建成堆,得到n个元素中关 键码次大 (或次小)的元素。以此类推,如此反复,直到进行 n-1次后,排序结束,便得到一个按关键码有序的序列。称这 个过程为堆排序。
91 47 24 16 85 36 53 30
小顶堆 :12,36,24,85,47,30,53,91
12 36 85 91 24
47 30 53
如果该序列是一个堆,则对应的这棵完全二叉树的特点是: 所有分支结点的值均不小于 (或不大于)其子女的值,即每棵 子树根结点的值是最大(或最小)的。 堆特点:堆顶元素是整个序列中最大(或最小)的元素。
91,47,85,24,36,53,30,16是一个大顶堆。
数据结构 1
在完全二叉树上,双亲和左右孩子之间的编号就是i和2i、 2i+1的关系。因此一个序列可以和一棵完全二叉树对应起来, 用双亲其左、右孩子之间的关系可以直观的分析是否符合堆 的特性。
大顶堆:91,47,85,24,36,53,30,16
2015-3-22
数据结构
20
堆排序(Heap Sort)
堆排序(Heap Sort) 1堆的定义
设有n个元素的序列 R1,R2,…,Rn,当且仅当满足下述关 系之一时,称之为堆。
k2i ki≤ k2i+1

k2i ki≥ 其中i=1,2,…,n/2
k2i+1
前者称为小顶堆,后者称为大顶堆。
如:序列
序列
2015-3-22
12,36,24,85,47,30,53,91是一个小顶堆;
仅需调整一次,
堆建成 。
2015元素后,将堆底元素送入堆顶(或将堆顶元素 与堆底元素交换),堆可能被破坏。 破坏的情况仅是根结点和其左右孩子之间可能不满足堆 的特性,而其左右子树仍然是局部的堆。
在这种情况下,将其R1 … Ri整理成堆。 (i=n-1..1)
d. 调整结束后,整棵树为堆。
91 47 24 36 85 53 30
36
53
建堆过程示例
2015-3-22 数据结构 14

例如,图中的完全二叉树表示一个有 8 个元素的无序序列: {49,38,65,97,76,13,27,49}(相同的两个关键字 49,其中后面一个用49表示),则构造堆的过程如图3(b) ~(f)所示。
2015-3-22
数据结构
8
2015-3-22
数据结构
9
3. 筛选算法
void HeapAdjust(datetype R[ ], int s, int t) { /*以R[s]为根的子树只有R[s]与其左右孩子之间可能不满足 堆特性*/ /*进行调整使以R[s]为根的子树成为大顶堆*/ datetype rc; /*缓冲变量*/ rc=R[s]; i=s; for(j=2*i; j<=t; j=2*j) /*沿关键码较大的孩子结点向下筛选*/ { if(j<t && R[j].key<R[j+1].key) j=j+1; /* j指向R[i]的关键码较大的孩子*/ if(rc.key > R[j].key) break; /*不用调到叶子就到位了*/ R[i]=R[j]; i=j; /*准备继续向下调整 */ } R[i]=rc; /*插入*/ } 2015-3-22 数据结构
53
47
85
b.调整结束后,以R4为
根的子树满足堆特性。 再将以R3结点为根的 子树调整为堆;
2015-3-22
数据结构
13
30 47 24 16
以 R2 为 根 的 子 树 满 足 堆特性。 再 将 以 R1 结 点 为 根 的 子树调整为堆
91
91 47 85 16 24 36 30 53 85 16
相关文档
最新文档