数据结构-8.4排序
前言-数据结构
数据结构是需要反复咀嚼,不管什么时候都可以重中获取现在在开发中的遇到的问题答案。
简单选择排序(和冒泡排序相似)
- 基本思想
- 在每一趟带排序的记录中选 出关键字最小的记录,按照顺序排放在已经排好序的记录序列的最后,直到序列全部有序。
- 算法步骤
- 从所有的n个记录中,选取关键字值最小的记录,与第一个记录交换位Y。
- 从所有的n-i+1个记录中,选取关键字值最小的记录,与第i个记录交换位置。
- i取2, 3, … n-1,重复执行②。
- 举例,给定n 8,数组R中的8个元素的排序码为: (8, 3, 2, 1,7,4,6,5),则直接选择排序过程如下图所示。
- 性能分析
- 考虑关键码的比较次数和数据对象移动次数,比较次数与数据对象的初始排列无关,总次数为n*(n 1)/2,移动次数与数据对象的初始排列有关,最少为0,最大为3(n-1),所以简单选择排序的时间复杂度为0(n2)。
- 简单选择排序的空间复杂度为0(1)。
- 简单选择排序是一种不稳定的排序方法。
简单选择排序
- 基本思想
树形选择排序方法是种按照锦标赛的思想进行选择排序的方法。 - 算法步骤
- 对所有n个记录的关键字两两比较,取出[n/2]个较小关键字记录,作为第一步的比较结果,再把这[n/2]个记录的关键字进行两两比较,.如此反复,直到找出最小的关键字记录为止。实际上这就建立了一棵完全二叉树。
- 选择下一个最小关键字记录。即先将叶子结点中上一次得到的关键字最小的记录的关键字值改为∞,再修改从叶子结点到根结点路径上所有结点所代表记录的关键字值。
- 重复执行②,直到将n个待排序记录都取出为止。
- 例子
- 性能分析
- 树型选择排序形如在一棵完全 二叉树上进行操作,所以关键码的比较次数和数据对象移动次数都不会超过log2n所以树型选择排序的时间复杂度为0(nlog2n)。
- 树型选择排序需要的空间特别的多,完全叉树上除去叶子结点外的空间, 都是附加空间,所以它的空间复杂度为0(n)。
- 树型选择排序是种稳定的排序 方法。
堆排序(重要)
-
定义
-
堆排序实际上是对树型排序的一个改造,它克服了树型排序所需要的巨大附加空间,n个元素的序列H={k,k2, . kn,}, 对于所有的i=1, 2… Ln/2],当它满足如下关系:
-
所有根都比孩子大 大根堆
-
所有根都比孩子小 小根堆
-
堆的性质 根据堆的定义可知,堆是以可完全二叉树。
-
堆所对应的完全二叉树的根结点是元素序列中的值最小或最大元素。
-
从根结点到每一个叶子结点的路径上的元素组成的序列都是按元素值递增或递减。
-
堆可以采用一维数组来存储。
-
基本思想
-
算法步骤
-
对组待排序记录的关键字, 按照堆的定义,建立一个最小堆:
-
输出关键字值最小的记录:
-
对剩余的待排序记录,重复执行第一步 和第二步,直到全部的记录排好为止。
-
上述步骤中,出现两个重点问题:
- 怎样将给定的排序记录构成个初始堆?
- 输出关键字值最小的记录后,如何将剩余记录整理成一个新的堆?
-
筛选法调整堆:从r[2s]和r[2s+1]中选出关键字较大者,假设r[2s]的关键 字较大,比较r[s] 和r[2s]的关键字
- 若r[s]. key>=r[2s]. key,说明以r[s]和r[2s]为根的子树已经是堆,不必做调整
- 若r[s]. key<r[2s]. key。交换后,以r[2s+1]为根的子树仍是堆, 如果r[2s]为根的子树不是堆,则重复上述过程,将以r[2s]为根的子树调整为堆,直至进行到叶子结为止。
-
建初堆:
- 对于无序序列r[1. .n], 从i=n/2开始, 反复调用筛选法,依次将以r[i],r[i-1],. . .,r[1]为根的子堆调整为堆。
-
例子1
-
例子2
-
例子3 堆排序 对排序码46, 55, 13, 42, 94, 05, 17, 70,建成如更好图所示的大根堆后,堆排序过程
- 从上述过程可知,将其结果按完全二叉树形式输出,则得到结果为: 05, 13, 17,42, 46,55, 70,94,即为堆排序的结果。
- 性能分析
- 堆排序形如在一棵完全 二叉树上进行操作,所以关键码的比较次数和数据对象移动次数都不会超过log2n所以堆排序的时间复杂度为O(nlog2n)。
- 堆排序需要的附加空间为1,所以它的空间复杂度为0(1)。
- 堆排序是一种不稳定的排序方法。