大话数据结构9之排序
1.使得序列成为一个按关键字有序的序列,这样的操作称为排序。
2.排序的稳定性:稳定和非稳定的
3.内排序与外排序:
内排序:是在排序整个过程中,待排序的所有记录全部被放置在内存中。
外排序:由于排序的记录个数太多,不能同时放置在内存,整个排序过程需要在内外存之间多次交换数据才能进行。
内排序:性能受3个方面影响 时间性能 辅助空间 算法的复杂性
根据排序过程中借助的主要槽组内排序分为:插入排序 交换排序 选择排序 归并排序
按照算法的复杂度分为两大类:冒泡排序 简单选择排序 直接插入排序 属于简单排序。 希尔排序 堆排序 归并排序 快速排序 属于改进算法
4.冒泡排序
冒泡排序(Bubble sort)一种交换排序,它的基本思想是:两两比较相邻记录的关键字,入如果反序则交换,直到没有反序的记录为止。时间复杂度为O(n2).
5.简单选择排序
简单选择排序(simple selection sort)就是通过n-i次关键字间的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1≤i≤n)个记录交换之。时间复杂度为O(n2).性能略优于冒泡排序。
6.直接插入排序
直接插入排序(Straight Insertion Sort )的基本操作是将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表。时间复杂度为O(n2)。性能比冒泡和简单选择排序好点。
7.希尔排序
基本有序,就是小的关键字基本在前面,大的基本在前面,不大不小的基本在中间。
跳跃分割:将相距某个“增量”的记录组成一个子序列,这样才能保证在子序列内分别进行直接插入排序后得到的结果是基本有序而不是局部有序。增量序列的最后一个增量值必须等于1才行。
希尔排序的关键不是随便分组后各自排序,而是将相隔某个增量的记录组成一个子序列,实现跳跃式的移动,使得排序的效率提高。时间复杂的为O(n3/2)。直接插入排序的升级
8.堆排序
堆排序(heap sort)就是对简单选择排序进行的一种改进。
堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。
堆排序算法:堆排序(heap sort)就是利用堆(假设利用大顶堆)进行排序的方法。它的基本思想是,将待排序的序列构造成一个大顶堆。此时,整个序列的最大值就是堆顶堆根结点。把它移走(其实就是将其与堆数组的末尾元素交换,此时末尾元素就是最大值),然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素中次小值。如此反复执行,便能得到一个有序序列了。
时间复杂度为O(nlogn)
9.归并排序
归并排序(merging sort)就是利用归并的思想实现的排序方法。它的原理是假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到[n/2]([x]表示不小于小x的最小整数)个长度为2或1的有序子序列;再两两归并,。。。,如此重复,直到得到一个长度为n的有序序列为止,这种排序方法称为2路归并排序。
时间复杂度为O(nlogn)
空间复杂度O(n+logn)
递归归并排序是一种比较占用内存,但却效率很高且稳定的算法。
非递归的迭代方法避免了递归时深度为log2n的栈空间,空间复杂度为O(n),使用归并排序时尽量考虑用非递归方法。
10.快速排序(很强)
快速排序(quick sort)的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可以分别对这两部分记录继续进行排序,以达到整个序列有序的目的。
最优情况下,时间复杂度为O(nlogn)
快速排序优化
优化选取枢轴
优化不必要的变换
优化小数组时的排序方案
优化递归操作
排序
插入排序类 选择排序类 交换排序类 归并排序类
直接插入排序 希尔排序 简单选择排序 堆排序 冒泡排序 快速排序 归并排序
排序方法 | 平均情况 | 最好情况 | 最坏情况 | 辅助空间 | 稳定性 |
冒泡排序 | O(n2) | O(n) | O(n2) | O(1) | 稳定 |
简单选择排序 | O(n2) | O(n2) | O(n2) | O(1) | 稳定 |
直接插入排序 | O(n2) | O(n) | O(n2) | O(1) | 稳定 |
希尔排序 | O(nlogn)~O(n2) | O(n1.3) | O(n2) | O(1) | 不稳定 |
堆排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(1) | 不稳定 |
归并排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(n) | 稳定 |
快速排序 | O(nlogn) | O(nlogn) | O(n2) | O(nlogn)~O(n) | 不稳定 |
从综合各项指标来说,经过优化的快速排序是性能最好的排序算法。