vlambda博客
学习文章列表

数据结构:排序(3)|| 选择排序

简单选择排序

这可能是你从小学二年级就学会的最经典排序。

while(i!=L.length())

{

从所有当中,选择最小值;

把最小值放在第i++个位置;

}

类似如此,其实就是简单选择排序的思想了。

本文的内容是在简单选择排序的基础上加以改进,使它具有更高的效率。


树形选择排序又称锦标赛排序

利用锦标赛中决出冠军的思想,可以完成选择


树形选择排序逻辑:

锦标赛选择最小值->输出最小值->把最小值定义为∞修改相关“比赛”,重新决出最小值(其实是第二名了)

不断比赛之后,就决出了所有名次。


树形选择排序:https://studygolang.com/articles/13621


数据结构:排序(3)|| 选择排序

数据结构:排序(3)|| 选择排序

依此类推...

该算法涉及:建树、修改等操作,完整代码在之后重新发推给出。


堆排序

堆是一种数据结构,被用于实现优先队列。

① 堆中的每个结点最多有两个子节点。

② 结点的排列顺序垂直从上到下,水平从左到右。

③ 子节点key必须大于父母结点。

为了遵守规则②,向堆中插入数据时,一般插入在最靠下最靠左的位置,除非最后一排满了,不另起一行。

堆操作图解:

数据结构:排序(3)|| 选择排序


所以,堆也具有选择的功能,可以用于排序。

由堆的知识,我们就可以知道,每次向堆中取出一个数据,由堆的性质,再取出,就是下一个被选择的数据,反复取出,便得到有序序列,这就是堆排序。堆排序对记录很多时,效率是很高的,但对于记录较少时,反而浪费了大量时间用于建堆和筛选上。

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)的时间复杂度。