问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

在堆排序的过程中为什么要从n/2到1的顺序进行建堆过程而不是反过来

发布网友 发布时间:2022-04-22 18:09

我来回答

5个回答

热心网友 时间:2023-11-14 22:54

【概念】堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。可以利用数组的特点快速定位指定索引的元素。堆分为大根堆和小根堆,是完全二叉树。大根堆的要求是每个节点的值都不大于其父节点的值,即A[PARENT[i]] >= A[i]。在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的要求可知,最大的值一定在堆顶。
【起源】
1991年的计算机先驱奖获得者、斯坦福大学计算机科学系教授罗伯特·弗洛伊德(Robert W.Floyd)和威廉姆斯(J.Williams)在1964年共同发明了著名的堆排序算法( Heap Sort )。
【简介】
堆排序利用了大根堆(或小根堆)堆顶记录的关键字最大(或最小)这一特征,使得在当前无序区中选取最大(或最小)关键字的记录变得简单。
(1)用大根堆排序的基本思想
① 先将初始文件R[1..n]建成一个大根堆,此堆为初始的无序区
② 再将关键字最大的记录R[1](即堆顶)和无序区的最后一个记录R[n]交换,由此得到新的无序区R[1..n-1]和有序区R[n],且满足R[1..n-1].keys≤R[n].key
③由于交换后新的根R[1]可能违反堆性质,故应将当前无序区R[1..n-1]调整为堆。然后再次将R[1..n-1]中关键字最大的记录R[1]和该区间的最后一个记录R[n-1]交换,由此得到新的无序区R[1..n-2]和有序区R[n-1..n],且仍满足关系R[1..n-2].keys≤R[n-1..n].keys,同样要将R[1..n-2]调整为堆。
……
直到无序区只有一个元素为止。
(2)大根堆排序算法的基本操作:
①建堆,建堆是不断调整堆的过程,从len/2处开始调整,一直到第一个节点,此处len是堆中元素的个数。建堆的过程是线性的过程,从len/2到0处一直调用调整堆的过程,相当于o(h1)+o(h2)…+o(hlen/2) 其中h表示节点的深度,len/2表示节点的个数,这是一个求和的过程,结果是线性的O(n)。
②调整堆:调整堆在构建堆的过程中会用到,而且在堆排序过程中也会用到。利用的思想是比较节点i和它的孩子节点left(i),right(i),选出三者最大(或者最小)者,如果最大(小)值不是节点i而是它的一个孩子节点,那边交互节点i和该节点,然后再调用调整堆过程,这是一个递归的过程。调整堆的过程时间复杂度与堆的深度有关系,是lgn的操作,因为是沿着深度方向进行调整的。
③堆排序:堆排序是利用上面的两个过程来进行的。首先是根据元素构建堆。然后将堆的根节点取出(一般是与最后一个节点进行交换),将前面len-1个节点继续进行堆调整的过程,然后再将根节点取出,这样一直到所有节点都取出。堆排序过程的时间复杂度是O(nlgn)。因为建堆的时间复杂度是O(n)(调用一次);调整堆的时间复杂度是lgn,调用了n-1次,所以堆排序的时间复杂度是O(nlgn)[2]
注意:
①只需做n-1趟排序,选出较大的n-1个关键字即可以使得文件递增有序。
②用小根堆排序与利用大根堆类似,只不过其排序结果是递减有序的。堆排序和直接选择排序相反:在任何时刻堆排序中无序区总是在有序区之前,且有序区是在原向量的尾部由后往前逐步扩大至整个向量为止
【特点】
堆排序(HeapSort)是一树形选择排序。堆排序的特点是:在排序过程中,将R[l..n]看成是一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系(参见二叉树的顺序存储结构),在当前无序区中选择关键字最大(或最小)的记录
【算法分析】
堆排序的时间,主要由建立初始堆和反复重建堆这两部分的时间开销构成,它们均是通过调用Heapify实现的。
平均性能:O(N*logN)。
其他性能:由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件。堆排序是就地排序,辅助空间为O(1)。它是不稳定的排序方法。(排序的稳定性是指如果在排序的序列中,存在前后相同的两个元素的话,排序前 和排序后他们的相对位置不发生变化)。

热心网友 时间:2023-11-14 22:54

建堆是为了,确保根节点最大或者最小(按你的需求),并且要确保所有有孩子的节点都比孩子大或者小(按你的需求)

n/2:表示有n/2或者n/2+1个节点,并且这些节点有孩子,完全二叉树有这个规律。
逆序是因为要确保所有的孩子与父节点都进行了比较,不然顺序的话,你怎么确保根节点满足需求呢?他的孩子还在变化。
最后,你的提问有点错误:(n/2, 0]或者[n/2, 0]取决于是否是整除

热心网友 时间:2023-11-14 22:55

首先堆排序针对的是一个丝毫不满足最大堆特点的一个数组(0号位置不放元素),首先要从后向前调整每一个非叶子结点开始(也就是倒数第二层),这个是用来建立堆的(就是让误规律的变成有一定规律的),若你从前向后就会忽略另一条大分支树,一条道走到黑了,不能正确建立堆;后面可以从前往后调整的原因是只有最顶上的那个被换了,其他分支都是满足最大堆的
void heap_sort(int *list, int n) {
int temp;
for (int i = n / 2; i > 0; i--) //不要从i=1到i<=n/2这样循环(这一步是把一个无序数组从后向前建立成一个堆)
heap_adjust(list, i, n);
for (int j = n-1; j > 0; j--) {
SWAP(list[1], list[j+1], temp);
heap_adjust(list, 1, j); //这块可以从前向后的原因是只有堆顶不满足最大堆性质
}
}

热心网友 时间:2023-11-14 22:55

参考这个,只不过是数学上处理的小技巧。网页链接。

我明明答的是这个过程O(N)复杂度的证明,怎么会跳来这个问题了。

热心网友 时间:2023-11-14 22:56

首先说下,堆排序建堆的过程可以有两种方法。下沉法和上浮法;从[n, 1]需要使用swim上浮的方法,如果是[n/2,1]需要用sink下沉的方法;从n/2开始,使用下沉的方法,当第n/2个位置确定的时候,两个子节点n和n+1的位置也就确定了,所以只需要比较数组一半的元素;如果采用swim的方法,则需要全部遍历数组;
比较来说,当然是选用sink作为排序方法。建议可以参考sedgewick 《算法》中第二章排序中优先队列的内容。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
八月中国最凉快的地方 八月份哪里最凉快,去哪旅游好?美丽的地方 乱字同韵字是什么意思 华硕笔记本电脑触摸板怎么开笔记本电脑触摸板怎么开启和关闭_百度知 ... 陕西职务侵占案立案准则 结婚后我的恋情维系了十年,怎么做到的? 玉米仁子饭产自哪里 中国期货交易所的交易品种有哪些? 历史要怎么读,有啥诀窍 高中历史诀窍 对一组记录的关键码为(46,79,56,38,40,84),如果采用堆排序方法,则建立的初始堆是? 堆排序算法 假定对元素序列(7,3,5,9,1,12)进行堆排序,且采用小根堆,则由初始数据构成的初始堆为_______ 计算机的相关知识,堆排序是指什么? 初始堆后堆排序 对元素序列如何进行堆排序 请问一下啊 堆排序是怎么回事 是什么意思 请问什么是堆排序 这么大个网络,就没人会数据结构? 第3题求堆排序的初始堆,怎么解 ,谢了 数据结构的堆排序和初始堆的概念...我被搞懵了...他们有什么不同.. 初始堆是什么?是已经用堆排序排完的最终的堆吗? 二次函数的对称轴公式是怎么推导出来的 怎样求一个点关于二次函数图像的对称点? 二次函数关于对称轴的对称点 关于二次函数原点的对称点的坐标怎么求 二次函数对称轴公式是? 二次函数对称轴和顶点公式是什么? 二次函数对称轴怎么判断 如何判断二次函数的开口方向,对称轴,和顶点坐标 怎么求二次函数的对称轴和地点坐标 ubuntu怎么下载windows镜像 梦见西瓜分成两半被掏空 ubuntu的内核映像文件在那个目录中? Ubuntu镜像文件到底是多大呢? 谁有ubuntu的镜像文件,最好百度云 梦见单位分大米西瓜 怎么在WIN7下硬盘安装linux双系统 梦见我去世的爷爷在给我们分西瓜跟香蕉吃,什么意思 vmware虚拟机中ubuntu 16.04 详细安装教程附下载地址 乌班图到底该怎么安装啊 ubuntu下载为什么不是镜像 七年级下册四字成语解释造句 能否将当前的ubuntu系统制作成iso镜像文件 Ubuntu10.10镜像文件下载 ubuntu安装完毕后 镜像文件可以删吗 linux ubuntu 关于镜像文件 ubuntu安装完毕后 镜像文件可以删吗? 春卷 怎么做 春卷是怎么做出来的 春卷的做法简易步骤,