[数据结构] 内排序(2)

上一篇文章提到了快速排序、冒泡排序、直接插入排序、直接选择排序和希尔排序。这篇文章说堆排序、归并排序和基数排序。堆排序、快速排序和归并排序时间复杂度都是O(nlogn)

堆排序

二叉堆的定义

  • 二叉堆满足二个特性:
  • 1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。
  • 2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。
  • 当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆。当父结点的键值总是小于或等于任何一个子节点的键值时为最小堆。下图展示一个最小堆:

堆的存储结构

由于堆是完全二叉树,所以堆用数组存储。

堆排序基本思想

堆排序的基本思想是:将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列了。

步骤一 构造初始堆。

将给定无序序列构造成一个大顶堆(一般升序采用大顶堆,降序采用小顶堆)。

步骤二 将堆顶元素与末尾元素进行交换,使末尾元素最大。

然后继续调整堆,再将堆顶元素与末尾元素交换,得到第二大元素。如此反复进行交换、重建、交换

归并排序

基本思想

归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

基本过程

基数排序

基本思想

基数排序:通过序列中各个元素的值,对排序的N个元素进行若干趟的“分配”与“收集”来实现排序。
分配:我们将L[i]中的元素取出,首先确定其个位上的数字,根据该数字分配到与之序号相同的桶中
收集:当序列中所有的元素都分配到对应的桶中,再按照顺序依次将桶中的元素收集形成新的一个待排序列L[ ]
对新形成的序列L[]重复执行分配和收集元素中的十位、百位...直到分配完该序列中的最高位,则排序结束

基本过程

排序算法总结

参考文献:

https://www.cnblogs.com/chengxiao/p/6129630.html

https://www.jianshu.com/p/7d037c332a9d

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值