[Data Structure & Algorithm] 选择排序+锦标赛排序+堆排序
基本思想
- 通过比较,将最小的记录与最前面的记录交换位置。
- 最前面的记录 - 第一次是第一位,第二次是第二位,以此类推
直接选择排序
- 基本思想
1.从第一个记录开始逐个比较,将指针指向最小的记录,直到比较完最后一个记录
2.将最小的记录和最前面的记录交换位置
3.再次循环从第二个记录开始比较,将第二小的记录交换到第二位,依次进行,直到全部记录排序完成
- 优势 - 移动记录的次数较少
- 最好状况 - 正序 - 无需移动
- 最坏状况 - 逆序 - n-1次交换,每次交换移动3次
- 缺点 - 比较记录的次数较多 - n*(n-1)/2
- 时间复杂度 - O(n2)
树形选择排序(锦标赛排序)
- 基本思想
- 第一轮排序,把全部记录做为树的最后一层,两两分组(若是共有奇数个记录,则最后补上∞),取其中较小的记录做为倒数第二层
- 依次类推,最终获得的根结点即为这一轮中的最小值
- 第二轮排序,将上一轮中的最小值用∞表示,从新构造树,新的根结点即为这一轮的最小值
- 优势 - 比较次数相对直接选择较小
- 缺点
- 时间复杂度 - O(nlog2n)
堆排序(优先队列)
- 二叉堆
- 性质
- 彻底二叉树
- 全部非叶子结点都不大于其左、右孩子结点
- 表示 - 数组
- 对于数组中元素Array[i],他的左孩子是Array[2i],右孩子是Array[2i+1],父节点是Array[i/2]
- 操做
- 插入 Insert - 上滤
1.找到最后一个非叶子结点,即最后一个叶子结点的父节点Array[n/2]
2.以这个结点为根结点,与其左右孩子比较,将最小值调整为根结点
3.继续调整与这个结点在同一层的其余结点
4.这层调整完后,向上一层进行比较,此时若是有交换,须要注意交换后的结点是否会影响其做为根结点的堆结构
- 删除最小值 DeleteMin - 下滤
1.当前根结点(即最小值)移除后,将最后一个叶子结点交换至根结点,获得新的根结点
2.将如今的根结点与其左右孩子比较,把较小的值交换到根结点
3.若是有交换,则这个孩子的子树的堆结构可能被破坏,重复2,直到最后一层的叶子结点
- 基本思想
1.构造二叉堆 - 上滤
- 按照输入顺序,先构造一个彻底二叉树,再用上滤操做构造二叉堆
2.DeleteMin - 下滤
- 优势
欢迎关注本站公众号,获取更多信息