基本思想
- 经过比较,将最小的记录与最前面的记录交换位置。
- 最前面的记录 - 第一次是第一位,第二次是第二位,以此类推
直接选择排序
- 基本思想
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 - 下滤
- 优点
posted @
2018-10-30 20:51
break大蜗牛
阅读(
313)
评论()
编辑
收藏
举报