大话数据结构 第九章 排序
其他
2020-02-15 19:23:31
阅读次数: 0
排序
基本概念
- 稳定性:假使关键字ki = kj,且在排序前的序列中ri领先于rj(即i<j)。如果排序后ri仍领先于rj,则称所用的排序方法是稳定的;反之,若可能使得排序后的序列中rj领先于ri,则称所用的排序方法是不稳定的
- 内排序/外排序:待排序的记录是否全部被放置在内存中
- 排序算法的性能:时间性能、辅助空间、算法的复杂性
分类
按复杂度分
- 简单算法:冒泡排序、简单选择排序、直接插入排序
- 改进算法:希尔排序、堆排序、归并排序、快速排序
按主要操作分
- 插入排序类:直接插入排序、希尔排序
- 选择排序类:简单选择排序、堆排序
- 交换排序类:冒泡排序、快速排序
- 归并排序类:归并排序
冒泡排序
- 冒泡排序是一种交换排序
- 其基本思想是:两两比较相邻记录的关键字,如果反序则交换,直至没有反序的记录为止
- 总的时间复杂度是O(n^2)
简单选择排序
- 简单选择排序就是通过 n-i 次关键字之间的比较,从 n-i+1 个记录中选出关键字最小的记录,并和第 i 个记录交换之
- 总的时间复杂度是O(n^2)
- 在性能上略优于冒泡排序
直接插入排序
- 直接插入排序的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表
- 总的时间复杂度是O(n^2)
- 在性能上比冒泡排序和直接插入排序要好一些
希尔排序
- 是插入排序的升级
- 希尔排序将原本有大量记录数的记录进行分组,分割成若干个子序列,分别进行直接插入排序。当整个序列都基本有序(小的关键字基本在前面,大的基本在后面,不大不小的基本在中间)时,再对全体记录进行一次直接插入排序
- 采取了跳跃分割的策略:将相距某个“增量”的记录组成一个子序列,这样才能保证在子序列内分别进行直接插入排序后得到的结果是基本有序而不是局部有序
- 将关键字较小的记录,不是一步一步地往前挪动,而是跳跃式地往前移,使得排序的效率增高
- 总的时间复杂度在O(n log n)~O(n^2)
- 算法不稳定
堆排序
- 堆排序在做到每次选择到最小记录的同时,对其他记录也做出了相应的调整,从而提高效率
- 堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆
- 堆排序的基本思想是:将待排序的序列构造成一个大顶堆。此时,整个序列的最大值就是堆顶的根结点。将它移走(将其与堆数组的末尾元素交换是,此时末尾元素就是最大值),然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素中的次大值。如此反复执行,便能得到一个有序序列了
- 总的时间复杂度为O(n log n)
- 算法不稳定,不适合待排序序列个数较少的情况
归并排序
- 归并排序的基本思想是假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到[n/2]个长度为2或1的有序子序列;再两两归并,……,如此重复,直至得到一个长度为n的有序序列为止(2路归并排序)
- 总的时间复杂度为O(n log n)
- 不存在跳跃,算法稳定
- 比较占用内存,但效率较高
- 尽量使用非递归方法
快速排序
- 快速排序法是冒泡排序的升级
- 它的实现,增大了记录的比较和移动的距离,将关键字较大的记录从前面直接移动到后面,关键字较小的记录直接从后面移动到前面,从而减少了总的比较次数和移动交换次数
- 快速排序的基本思想是通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的
- 总的时间复杂度为O(n log n)
- 算法不稳定
算法优化
- 优化选取枢轴
- 优化不必要的交换
- 优化小数组时的排序方案
- 优化递归操作
7种算法的各种指标
排序方法 |
平均情况 |
最好情况 |
最坏情况 |
辅助空间 |
稳定性 |
冒泡排序 |
O(n^2) |
O(n) |
O(n^2) |
O(1) |
稳定 |
简单选择排序 |
O(n^2) |
O(n^2) |
O(n^2) |
O(1) |
稳定 |
直接插入排序 |
O(n^2) |
O(n) |
O(n^2) |
O(1) |
稳定 |
希尔排序 |
O(nlogn)~O(n^2) |
O(n^1.3) |
O(n^2) |
O(1) |
不稳定 |
堆排序 |
O(nlogn) |
O(nlogn) |
O(nlogn) |
O(1) |
不稳定 |
归并排序 |
O(nlogn) |
O(nlogn) |
O(nlogn) |
O(n) |
稳定 |
快速排序 |
O(nlogn) |
O(nlogn) |
O(n^2) |
O(logn)~O(n) |
不稳定 |
发布了59 篇原创文章 ·
获赞 3 ·
访问量 1795
转载自blog.csdn.net/Felix_hyfy/article/details/99588014