数据结构:简单选择排序树形选择排序和堆排序算法程序员进阶笔记

本节介绍三种选择排序算法,分别为:简单选择排序、树形选择排序和堆排序。

该算法的实现思想为:对于具有 n 个记录的无序表遍历 n-1 次,第 i 次从无序表中第 i 个记录开始,找出后序关键字中最小的记录,然后放置在第 i 的位置上。例如对无序表{56,12,80,91,20}采用简单选择排序算法进行排序,具体过程为:

简单选择排序的实现代码为:

树形选择排序(又称“锦标赛排序”),是一种按照锦标赛的思想进行选择排序的方法,即所有记录采取两两分组,筛选出较小(较大)的值;然后从筛选出的较小(较大)值中再两两分组选出更小(更大)值,依次类推,直到最后选出一个最小(最大)值。同样可以采用此方式筛选出次小(次大)值等。整个排序的过程,可以用一棵具有 n 个叶子结点的完全二叉树表示。例如对无序表{49,38,65,97,76,13,27,49}采用树形选择的方式排序,过程如下:

通过不断地重复此过程,可依次筛选出从小到大的所有关键字。该算法的时间复杂度为O(nlogn),同简单选择排序相比,该算法减少了不同记录之间的比较次数,但是程序运行所需要的空间较多。

在学习堆排序之前,首先需要了解堆的含义:在含有 n 个元素的序列中,如果序列中的元素满足下面其中一种关系时,此序列可以称之为堆。

对于堆的定义也可以使用完全二叉树来解释,因为在完全二叉树中第 i 个结点的左孩子恰好是第 2i 个结点,右孩子恰好是 2i+1 个结点。如果该序列可以被称为堆,则使用该序列构建的完全二叉树中,每个根结点的值都必须不小于(或者不大于)左右孩子结点的值。以无序表{49,38,65,97,76,13,27,49}来讲,其对应的堆用完全二叉树来表示为:

提示:堆用完全二叉树表示时,其表示方法不唯一,但是可以确定的是树的根结点要么是无序表中的最小值,要么是最大值。

通过将无序表转化为堆,可以直接找到表中最大值或者最小值,然后将其提取出来,令剩余的记录再重建一个堆,取出次大值或者次小值,如此反复执行就可以得到一个有序序列,此过程为堆排序。堆排序过程的代码实现需要解决两个问题:

首先先解决第 2 个问题。图 3 所示为一个完全二叉树,若去除堆顶元素,即删除二叉树的树根结点,此时用二叉树中最后一个结点 97 代替,如下图所示:

此时由于结点 97 比左右孩子结点的值都大,破坏了堆的结构,所以需要进行调整:首先以 堆顶元素 97 同左右子树比较,同值最小的结点交换位置,即 27 和 97 交换位置:

由于替代之后破坏了根结点右子树的堆结构,所以需要进行和上述一样的调整,即令 97 同 49 进行交换位置:

通过上述的调整,之前被破坏的堆结构又重新建立。从根结点到叶子结点的整个调整的过程,被称为“筛选”。解决第一个问题使用的就是不断筛选的过程,如下图所示,无序表{49,38,65,97,76,13,27,49}初步建立的完全二叉树,如下图所示:

在对上图做筛选工作时,规律是从底层结点开始,一直筛选到根结点。对于具有 n 个结点的完全二叉树,筛选工作开始的结点为第 ⌊n/2⌋个结点(此结点后序都是叶子结点,无需筛选)。所以,对于有 9 个结点的完全二叉树,筛选工作从第 4 个结点 97 开始,由于 97 > 49 ,所以需要相互交换,交换后如下图所示:

然后再筛选第 3 个结点 65 ,由于 65 比左右孩子结点都大,则选择一个最小的同 65 进行交换,交换后的结果为:

然后筛选第 2 个结点,由于其符合要求,所以不用筛选;最后筛选根结点 49 ,同 13 进行交换,交换后的结果为:

交换后,发现破坏了其右子树堆的结构,所以还需要调整,最终调整后的结果为:

所以实现堆排序的完整代码为:

提示:代码中为了体现构建堆和输出堆顶元素后重建堆的过程,堆在构建过程中,采用的是堆的第二种关系,即父亲结点的值比孩子结点的值大;重建堆的过程也是如此。

堆排序在最坏的情况下,其时间复杂度仍为O(nlogn)。这是相对于快速排序的优点所在。同时堆排序相对于树形选择排序,其只需要一个用于记录交换(rc)的辅助存储空间,比树形选择排序的运行空间更小。

本节介绍了三种选择排序:简单选择排序、树形选择排序和堆排序。树形选择排序的产生是考虑到为了减少简单选择排序过程中做比较操作的次数;堆排序的产生是考虑到树形选择排序在运行时申请的辅助存储空间多。要根据特定地情况,选择合适的选择排序算法。

THE END
0.《数据结构》学习系列——排序(下)二路合并选择排序 直接选择排序 伪代码 算法分析 锦标赛排序(树选择排序) 堆排序 伪代码 合并排序法 二路合并排序 两个有序文件合并成一个大的有序文件 总结 选择排序 思想 对待排序的文件进行n次选择,其中第i次选择第i小(大)的记录放在第i(n-i+1)个位置上 jvzquC41dnuh0lxfp0tfv8Pgpl{bp8ftvkimg8igvcomu86662=45A:
1.选择排序及改进算法4.2树型选择排序---锦标赛排序 基本思想 树型选择排序也称为锦标赛排序。其基本思想是:先把待排序的n个元素两两进行比较,取出较小者,若轮空则直接进入下一轮比较;然后在⎡n/2⎤个较小者中,采用同样的方法进行比较,再选出较小者;如此反复,直到选出关键字最小的元素为止。重复上述过程,直到所有元素全部jvzquC41dnuh0lxfp0tfv8segr{{j~fpi1gsvrhng1jfvjnnu1>56B=;2
2.计算机大赛算法,计算机经典算法——锦标赛排序算法本文探讨了如何通过二叉树结构模拟单淘汰锦标赛,如乒乓球和网球比赛,解释了如何通过比较和排序算法简化选冠过程。重点介绍了锦标赛排序法及其在工程中的应用,以及如何用最少比赛次数确定前3名。 关键词:二叉树 生活中的淘汰锦标赛:在单淘汰的锦标赛中,选手们两两比赛,胜者晋级,败者被淘汰。比如世界乒乓球锦标赛或者jvzquC41dnuh0lxfp0tfv8|gkzooa<832:7178ftvkimg8igvcomu863:9>43:;
3.数据结构选择排序树形选择排序堆排序树形选择排序①简单选择排序。 ②树形选择排序。←this ③堆排序。 树形选择排序(Tree Selection Sort),又称锦标赛排序(Tournament Sort)是一种按照锦标赛的思想进行选择排序的方法。 描述过程:首先对n个记录的关键字进行两两比较,然后在其中[n/2](取上界)个较大(小)者之间再进行两两比较,选出最大(小)关键字的记录为止。jvzquC41dnuh0lxfp0tfv8IqwDupoOq{1cxuklqg1fkucrqu196289628
4.10种排序算法精讲主要排序法有: 一、冒泡(Bubble)排序——相邻交换 二、选择排序——每次最小/大排在相应的位置 三、插入排序——将下一个插入已排好的序列中 四、壳(Shell)排序——缩小增量 五、归并排序 六、快速排序 七、堆排序 八、拓扑排序 九、锦标赛排序 jvzquC41dnuh0lxfp0tfv8ihcyksv;8671gsvrhng1jfvjnnu1713;82639
5.排序算法精讲在面试中经常会遇到排序算法的问题,尤其以快速排序、归并排序和堆排序。最近闲下来,把常用的排序算法做一个整理,对自己进行总结,以期对他人有点帮助。 各类算法总结 插入排序 最早拥有排序概念的机器出现在1901至1904年间由Hollerith发明出使用基数排序法的分类机,此机器包括打孔、制表等功能。 jvzquC41dnuh0lxfp0tfv8I222hfp9521cxuklqg1fkucrqu16?32B723
6.排序算法实现及复杂度分析(三)树形选择排序又称锦标赛排序,是一种按照锦标赛的思想进行选择排序的方法。首先对n个记录的关键字进行两两比较,然后在[n/2]个较小者之间进行两两比较,如此重复,直至选出最小关键字的记录为止。 它的时间复杂度为O(nlog2n),需要较多的辅助空间。 3.3、堆排序: jvzquC41dnuh0lxfp0tfv8lcxktop8ftvkimg8igvcomu8949889:
7.数据结构与算法代码整理:常见的选择排序法hanahimi1#选择排序法2defSelectSort(s):3n =len(s)4foriinrange(n-1):5min =i6forjinrange(i+1,n):7ifs[j]=2:#当存在两个以上的竞争者时,继续比赛(经过处理,nn必为偶数)14nnjvzquC41yy}/ewgnqiy/exr1jctbjrrk1r559;98394ivvq