9.7.1 堆排序算法(2)

7.再循环因为j=2*j=16,m=9,j>m,因此跳出循环。

8.第14行,将temp=30赋值给L.r[s]=L.r[8],完成30与60的交换工作。如图9‐7‐7所示。本次函数调用完成。

图9-7-7

9.再次调用HeapAdjust,此时s=3,m=9。第4行,temp=L.r[3]=90,第7~8行,由于4080,因此退出循环,最终本次调用,整个序列未发什么改变。

10.再次调用HeapAdjust,此时s=2,m=9。第4行,temp=L.r[2]=10,第7~8行,60

图9-7-8

11.再次调用HeapAdjust,此时s=1,m=9。第4行,temp=L.r[1]=50,第7~8行,70

图9-7-9

到此为止,我们构建大顶堆的过程算是完成了,也就是HeapSort函数的第4~5行循环执行完毕。或许是有点复杂,如果不明白,多试着模拟计算机执行的方式走几遍,应该就可以理解其原理。

接下来HeapSort函数的第6~11行就是正式的排序过程,由于有了前面的充分准备,其实这个排序就比较轻松了。下面是这部分代码。

6 for(i=L->length;i>1;i--) 7 { 8 swap(L,1,i); /* 将堆顶记录和当前未经排序子序列的最后一个记录交换 */ 9 HeapAdjust(L,1,i-1); /* 将L->r[1..i-1]重新调整为大顶堆 */ 10 }

1.当i=9时,第8行,交换20与90,第9行,将当前的根结点20进行大顶堆的调整,调整过程和刚才流程一样,找到它左右子结点的较大值,互换,再找到其子结点的较大值互换。此时序列变为{80,70,50,60,10,40,20,30,90},如图9‐7‐10所示。

(点击查看大图)图9-7-10

2.当i=8时,交换30与80,并将30与70交换,再与60交换,此时序列变为{70,60,50,30,10,40,20,80,90},如图9‐7‐11所示。

(点击查看大图)图9-7-11

3.后面的变化完全类似,不解释,只看图。

(点击查看大图)图9-7-12

最终就得到一个完全有序的序列了。

7.再循环因为j=2*j=16,m=9,j>m,因此跳出循环。

8.第14行,将temp=30赋值给L.r[s]=L.r[8],完成30与60的交换工作。如图9‐7‐7所示。本次函数调用完成。

图9-7-7

9.再次调用HeapAdjust,此时s=3,m=9。第4行,temp=L.r[3]=90,第7~8行,由于4080,因此退出循环,最终本次调用,整个序列未发什么改变。

10.再次调用HeapAdjust,此时s=2,m=9。第4行,temp=L.r[2]=10,第7~8行,60

图9-7-8

11.再次调用HeapAdjust,此时s=1,m=9。第4行,temp=L.r[1]=50,第7~8行,70

图9-7-9

到此为止,我们构建大顶堆的过程算是完成了,也就是HeapSort函数的第4~5行循环执行完毕。或许是有点复杂,如果不明白,多试着模拟计算机执行的方式走几遍,应该就可以理解其原理。

接下来HeapSort函数的第6~11行就是正式的排序过程,由于有了前面的充分准备,其实这个排序就比较轻松了。下面是这部分代码。

6 for(i=L->length;i>1;i--) 7 { 8 swap(L,1,i); /* 将堆顶记录和当前未经排序子序列的最后一个记录交换 */ 9 HeapAdjust(L,1,i-1); /* 将L->r[1..i-1]重新调整为大顶堆 */ 10 }

1.当i=9时,第8行,交换20与90,第9行,将当前的根结点20进行大顶堆的调整,调整过程和刚才流程一样,找到它左右子结点的较大值,互换,再找到其子结点的较大值互换。此时序列变为{80,70,50,60,10,40,20,30,90},如图9‐7‐10所示。

(点击查看大图)图9-7-10

2.当i=8时,交换30与80,并将30与70交换,再与60交换,此时序列变为{70,60,50,30,10,40,20,80,90},如图9‐7‐11所示。

(点击查看大图)图9-7-11

3.后面的变化完全类似,不解释,只看图。

(点击查看大图)图9-7-12

最终就得到一个完全有序的序列了。


相关内容

  • 数据结构中几种常见的排序算法之比较
  • 几种常见的排序算法之比较 2010-06-2014:04摘要:排序的基本概念以及其算法的种类,介绍几种常见的排序算法的算法:冒泡排的复杂度,然后以表格的形式,清晰直观的表现出它们的复杂度的不同.在研究学关键词: 一.引言 排序算法,是计算机编程中的一个常见问题.在日常的数据处理中,面对纷繁我们也许有 ...

  • 冒泡排序算法的分析与改进 算法设计
  • 冒泡排序算法的分析与改进 孙伟 (安徽中医学院 医药信息工程学院 09医软一班,安徽合肥,230009) 摘 要: 冒泡排序算法有两个优点:1"编程复杂度"很低,很容易写出代码:2. 具有稳定性,这里的稳定性是指原序列中相同元素的相对顺序仍然保持到排序后的序列,但当需要排序的数据 ...

  • 各种排序算法的复杂度排序法
  • 各种排序算法的复杂度 各算法的时间复杂度 平均时间复杂度 插入排序 O(n^2) 冒泡排序 O(n^2) 选择排序 O(n^2) 快速排序 O(n log n) 堆排序 O(n log n) 归并排序 O(n log n) 基数排序 O(n) 希尔排序 O(n^1.25) 1 快速排序(QuickS ...

  • 各种排序的时间复杂度
  • 排序算法 所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作. 分类 在计算机科学所使用的排序算法通常被分类为: 计算的复杂度(最差.平均.和最好表现),依据串列(list)的大小(n).一般而言,好的表现是O.(n log n),且坏的行为是Ω(n2).对於一个 ...

  • [数据结构]教学大纲
  • <数据结构>教学大纲 Data Structure 课程编号:J6110G0003 课程性质:学科基础课程 适用专业:计算机科学与技术.网络工程.数字媒体技术 先行课:计算机科学导论.离散数学.高级语言程序设计: 后续课:无 . 学分数:5 主讲教师:任燕.王命延.冯豫华.周石林.王玮立 ...

  • 数据结构排序毕业论文
  • 内容摘要 ..................................................................................................................................... 3 关键字 ..... ...

  • 第7章 排序 习题参考答案
  • 习题七 参考答案 一.选择题 1.内部排序算法的稳定性是指( D ) . A .该排序算法不允许有相同的关键字记录 B .该排序算法允许有相同的关键字记录 C .平均时间为0(n log n)的排序方法 D .以上都不对 2.下面给出的四种排序算法中,( B ) 是不稳定的排序. A .插入排序 B ...

  • 2010深圳大学专插本计算机科学与技术专业试题
  • 2010年深大计算机组成原理(回忆版) 一. 填空题(10个空) 1.组成计算机的5个组成基本部件: 2.主储存器的三个主要性能指标: 3.浮点数加减运算的五个步骤: 4.三级存储器结构: 5.DMA三种工作方式: 6.五种数据传送控制方式: 小结A:以上从我脑海挖出大概,希望对大家有帮助.还有感觉 ...

  • 常用的排序算法的时间复杂度和空间复杂度
  • 常用的排序算法的时间复杂度和空间复杂度 排序法 冒泡排序 快速排序 选择排序 二叉树排序 插入排序 堆排序 希尔排序 最差时间分析 O(n ) O(n ) O(n ) O(n ) O(n ) O(n*log2n) O2 2 2 2 2平均时间复杂度 O(n ) O(n*log2n) O(n ) O( ...

  • 算法设计与分析部分算法伪代码
  • 第三章 蛮力法 1. 选择排序 ⏹ SelectionSort(A[0..n-1]) for i=0 to n-2 do min=i for j=i+1 to n-1 do if A[j] 2. 冒泡排序 ⏹ BubbleSort(A[0..n-1]) // 输入:数组A ,数组中的元素属于某偏序集 ...