数据结构:排序(3)|| 选择排序
简单选择排序
这可能是你从小学二年级就学会的最经典排序。
while(i!=L.length())
{
从所有当中,选择最小值;
把最小值放在第i++个位置;
}
类似如此,其实就是简单选择排序的思想了。
本文的内容是在简单选择排序的基础上加以改进,使它具有更高的效率。
树形选择排序又称锦标赛排序
利用锦标赛中决出冠军的思想,可以完成选择
树形选择排序逻辑:
锦标赛选择最小值->输出最小值->把最小值定义为∞修改相关“比赛”,重新决出最小值(其实是第二名了)
不断比赛之后,就决出了所有名次。
树形选择排序:https://studygolang.com/articles/13621
依此类推...
该算法涉及:建树、修改等操作,完整代码在之后重新发推给出。
堆排序
堆 堆是一种数据结构,被用于实现优先队列。 ① 堆中的每个结点最多有两个子节点。 ② 结点的排列顺序垂直从上到下,水平从左到右。 ③ 子节点key必须大于父母结点。 为了遵守规则②,向堆中插入数据时,一般插入在最靠下最靠左的位置,除非最后一排满了,不另起一行。 堆操作图解: |
所以,堆也具有选择的功能,可以用于排序。
由堆的知识,我们就可以知道,每次向堆中取出一个数据,由堆的性质,再取出,就是下一个被选择的数据,反复取出,便得到有序序列,这就是堆排序。堆排序对记录很多时,效率是很高的,但对于记录较少时,反而浪费了大量时间用于建堆和筛选上。
void HeapSort ( HeapType &H ) {
// 对顺序表 H 进行堆排序
for ( i=H.length/2; i>0; --i )
HeapAdjust ( H.r, i, H.length ); // 建大顶堆
for ( i=H.length; i>1; --i ) {
H.r[1]←→H.r[i];
// 将堆顶记录和当前未经排序子序列
// H.r[1..i]中最后一个记录相互交换
HeapAdjust(H.r, 1, i-1); //对 H.r[1] 进行筛选
}
堆是一个重要的数据结构,在寒假中将开专题进行分析。上述算法中假设堆操作已经实现。
堆排序是不存在最坏情况的排序,即使是最坏情况,它也能保持O(n*logn)的时间复杂度。