【数据结构】选择排序 简单选择+堆排序
选择排序的基本思想是每次从待排序的序列中选出最小值(或者最大值)依次放在已排序序列中,直到待排序序列为空,此时序列已完全有序。选择排序的选择只需要进行n-1趟,因为当剩余元素数量为1时无需再选择,直接放在排序序列的末尾即可。
在这里学简单选择排序和堆排序两种算法,简单选择考的不多,堆排序是考察重点。
1.简单选择排序
简单选择排序就是根据选择排序的思想直观地得到的一种排序算法。其实现过程是:第i趟排序从L[i…n]中选择关键字最小的元素与L[i]进行交换,每趟确定一个元素的最终位置,当最后待排序元素只剩一个时就没必要交换了,所以经过n-1趟排序就能使整个排序表有序。
代码解释:

性能分析:
空间效率: 原地排序,空间复杂度为O(1)
时间效率: 对于元素移动次数,最好情况下为0,最坏情况下为3(n-1)。元素比较次数始终为n(n-1)/2。
总结下来,简单选择排序算法时间复杂度为O(n^2)
稳定性: 简单选择排序是一种不稳定的排序方法。
2.堆排序
补充:堆的定义

需要注意的是,堆并不是树,而是树的数组序列。也就是说,它既不是树形结构,也不是简单的线性结构,而是一个添加了后继关系以及限制了序列中元素大小关系的数组。
补充:堆的插入操作:
非常简单,只需要直接把新元素放入堆的底部,然后对堆进行一次调整即可。
堆排序的算法思想:
堆这种数据结构并不能直接生成有序序列。堆排序算法是利用堆排序的堆顶元素(即根节点)为最大(或最小)元素的性质。先将待排序序列构造成堆,输出堆顶元素得到一个待排的最小值或最小值,输出之后用下面的元素替补上去并调整堆的结构使其满足堆的堆顶最大性,这样就又能得到下一个最大值,重复这些步骤就能最终完成排序。
堆的构造过程:

基本思路就是从下至上地检测,如果有结点的值不大于其两个儿子结点的值,则将父节点与子节点中的较大值进行交换,这样不断从下到上进行,一轮完成之后,根节点上的元素就一定是最大值(但是下面的部分由于交换的进行可能会不完全符合堆的定义)
当输出堆顶元素后,就用堆中最后一个元素(叶结点)替补上去,然后从下到上再检测调整一遍使其形成新的堆。
注意,删除堆顶一个元素之后,不需要再从下到上调整一遍,因为下面的部分都已经符合堆的定义了,只需要进行一次headAdjust就行了。(这部分经常出删除操作或插入操作的比较次数的题目)
代码解释:

这里的调整算法并不是完整的调整,而只是头部调整(headAdjust)

性能分析:
堆排序算法特别适用于关键字特别多的情况。

空间效率:空间复杂度为O(1)
时间效率:建堆时间复杂度为O(n),每次调整的时间复杂度为O(n)
平均情况下堆排序的时间复杂度为O(nlog2n)
稳定性:堆排序算法是不稳定的排序算法。

浙公网安备 33010602011771号