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

...56,38,40,84),如果采用堆排序方法,则建立的初始堆是?

发布网友 发布时间:2022-04-24 17:02

我来回答

8个回答

热心网友 时间:2022-05-22 02:48

写一个pushdown和heapsort函数,按照建立完全二叉树的思想,建立最大堆时,结点值必须大于其左右儿子的值,以堆(的数量)不断扩大的方式进行初始建堆。以堆的规模逐渐缩小的方式进行堆排序。
把待排序的记录序列用完全二叉树的数组存储结构A表示
初始建堆:把数组所对应的完全二叉树以堆不断扩大的方式整理成堆。令i= n/2,…,2,1并分别把以n/2 ,…,2,1 为根的完全二叉树整理成堆,即执行算法PushDown ( i , n )。
堆排序:令i = n, n-1 ,…, 2
1.交换:把堆顶元素(当前最小的)与位置i(当前最大的叶结点下标)的元素交换,即执行swap(A[1],A[i]);
2.整理:把剩余的i-1个元素整理成堆,即执行PushDown(1 , i-1);
3.重复执行完这一过程之后,则A[1],A[2],…,A[n]是按关键字不增顺序的有序序列。
void HeapSort ( int n , LIST A )
{inti;
for( i=n/2; i<=1; i++) /*初始建堆,从最右非叶结点开始*/
PushDown( i, n); /*整理堆,把以i为根,最大下标的叶为n*/
for( i=n; i<=2; i--) {
swap(A[1],A[i]); //堆顶与当前堆中的下标最大的叶结点交换
PushDown( 1, i-1 );
/*整理堆把以1为根,最大叶下标为i-1的完全二元树整理成堆*/
整理堆算法:PushDown( first , last)
把以A[first]为根,以A[last]为最右边叶结点的完全二叉树整理成堆。根据堆的定义,它要完成的功能是,把完全二元树中的关键字最小的元素放到堆顶,而把原堆顶元素下 推到适当的位置,使(A[first],…,A[last])成为堆。
那么,怎样把关键字最小的元素放到堆顶,把堆顶元素下推到适当位置呢?
具体操作(要点)如下:
把完全二元树的根或者子树的根与其左、右儿子比较如果它比其左/右儿子大,则与其中较小者交换(若、右儿子相等,则与其左儿子交换)。重复上述过程直到以A[ first]为根的完全二元树是堆为止。
PushDown( first , last)算法实现如下:
void PushDown(int first,int last)
{ /*整理堆:A是外部数组,把A[first]下推到完全二元树的适当位置*/
int r=first; /* r是被下推到的适当位置,初始值为根first*/
while(r<=last/2) /* A[r]不是叶,否则是堆*/
if((r==last/2) && (last%2==0)) {/* r有一个儿子在2*r上且为左儿子*/
if(A[r].key>A[2*r].key)
swap(A[r],A[2*r]);/*下推*/
r=last; /*A[r].key小于等于A[2*r].key或者"大于",交换后到叶,循环结束*/
} else if((A[r].key>A[2*r].key)&&(A[2*r].key<=A[2*r+1].key)) {
/*根大于左儿子,且左儿子小于或等于右儿子*/
swap(A[r],A[2*r]); /*与左儿子交换*/
r=2*r; /*下推到的位置也是下次考虑的根*/
} else if((A[r].key>A[2*r+1].key)&&(A[2*r+1].key<A[2*r].key)) {
/*根大于右儿子,且右儿子小于左儿子*/
swap(A[r],A[2*r+1]); /*与右儿子交换*/
r=2*r+1; /*下推到的位置也是下次考虑的根*/
}else /*A[r]符合堆的定义,不必整理,循环结束*/
r=last;

热心网友 时间:2022-05-22 04:06

为一个无序序列建立堆的过程就是对完全二叉树从下往上反复"筛选(筛选法调整堆)"的过程。因为完全二叉树的最后一个非叶结点的编号为(n/2)-1,所以"筛选"只需从编号(n/2)-1的结点开始。按照筛选法将完全二叉树调整成满足堆的定义,则得出来的就是初始堆。
所以答案为(84 79 56 38 40 46),选D。
信不信由你,我是对着数据结构书中建初始堆的过程做出来的

热心网友 时间:2022-05-22 05:41

正确答案是C
我们默认关键字是46和84比。大的话。换过来84,79,56,38,40,46
然后就是79跟46比 ,大46,顺序不变
56和46比。顺序也不边
38和46 小。换过来。,现在的记过是84,79,56,46,40,38
然后用40和38比。不变所以答案就是 84,79,56,46,40,38

热心网友 时间:2022-05-22 07:32

构造初始结构:(用大顶堆)
46
79 56
38 40 84
从最后一个非叶子结点开始,依次调整:
46
79 84
38 40 56
84
79 46
38 40 56
84
79 56
38 40 46
即84,79,56,38,40,46

热心网友 时间:2022-05-22 09:40

额。。堆排序。。这是数据结构的啊。。。不是数据库方面的哦。。呵呵。。大一还是大二上的了差不多忘记了。。。

热心网友 时间:2022-05-22 12:05

首先84和56对换,然后84和46对换,46再和56对换

热心网友 时间:2022-05-22 14:46

正确答案应该为D吧

热心网友 时间:2022-05-22 17:44

妈呀,正确答案是d吧?我们老师给的答案是d.不是a
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
我爱我校征文800字 建行聚财宝少一万时5小时内补上会怎样 咪哩乡文化教育 咪哩乡基础设施 咪哩村云南省玉溪市元江县咪哩乡咪哩村 咪哩乡历史文化 元江咪哩中心小学怎么样? 原神 原神胡桃进阶材料是什么? 原神 原神呢胡桃材料有哪些? 原神 原神胡桃的突破材料是什么? C++堆排序建堆问题 数据结构的堆排序和初始堆的概念...我被搞懵了...他们有什么不同... ...写出初始建堆过程图示,再根据初始堆写出堆排序过程图示。_百度知 ... 请问工商银行的白金卡怎么办理啊?什么是白金卡啊~ 工行牡丹白金卡的办卡条件和途径? 工行信用卡申请:工行白金卡申请需要什么条件 工商银行借记卡金卡,白金卡.办理要什么条件 赛尔号,为什么游戏里迪恩是女的?动画片和电影里是男?还有为什么游戏里迪恩是好人,电影和动画里是坏人 赛尔号:迪恩的真实身份是什么啊? 赛尔号欧比组织迪恩究竟是什么人 赛尔号 这是什么精灵啊???图鉴里没有的一个 赛尔号6迪恩和他的精灵怎么样?叛变了吗? 赛尔号 迪恩的精灵 赛尔号上的迪恩是谁 迪恩·卡朋的追随精灵 小额贷款需要条件? 小额贷款有什么申请条件 冷水机冷冻机? 制冷量为22kw的制冷机相当于多少匹? 20匹的制冷机组控制箱和30匹有区别吗? 第三大题的应用题第一题 ①堆排序方法从小到大排序是什么意思?是要用小... 在手机上怎么查看QQ号码 手机qq号码忘了怎么办 用手机 作为qq号码可以吗? 如何用手机申请手机QQ号码 清风1758跑步机怎么链接手机? lncllne跑步机怎么连接手机音乐 立久佳A6跑步机怎样连接手机蓝牙? 贝德拉跑步机怎么和手机连蓝牙 小金k12跑步机TRK12F怎样用手机控制? 莫比跑步机能连几个手机 益步跑步机联网怎么切换数字 电视剧《夫妻那些事儿》洪小梅的扮演者是谁? 大连股票群 《L.L.DKELINB 》是不是老人头的标志? 米其林轮胎带有SNI什么意思? 我家的夏普电视怎么投屏不了? 实验室装修一般改造步骤有哪些? 如何查某个水果的名字? 中国人什么时候用筷子,由来众说纷纭