目录
排序算法可以分为内部排序和外部排序:
内部排序是数据记录在内存中进行排序;
外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存
排序算法 | 平均时间复杂度 | 最好情况 | 最坏情况 | 空间复杂度 | 排序方式 | 稳定性 |
---|---|---|---|---|---|---|
冒泡排序 | O(n^2) | O(n) | O(n^2) | O(1) | In-place | 稳定 |
选择排序 | O(n^2) | O(n^2) | O(n^2) | O(1) | In-place | 不稳定 |
插入排序 | O(n^2) | O(n) | O(n^2) | O(1) | In-place | 稳定 |
归并排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(n) | Out-place | 稳定 |
快速排序 | O(nlogn) | O(nlogn) | O(n^2) | O(logn) | In-place | 不稳定 |
堆排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(1) | In-place | 不稳定 |
ps:时间复杂度和空间复杂度
算法效率分为时间效率和空间效率:
时间效率被称为时间复杂度:算法中的基本语句重复执行的次数;
基本语句:对算法的运行时间贡献最大,也就是执行次数最多的语句;
空间效率被称为空间复杂度:空间复杂度算的是变量的个数;
辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于0的常数,即f(n)是T(n)的同数量级函数,记作T(n) = O(f(n)):算法的渐进时间复杂度;
用常数1取代运行时间中的所有加法常数;
例如:
最坏时间复杂度:任意输入规模的最大运行次数;
平均时间复杂度:任意输入规模的期望运行次数;
最好时间复杂度:任意输入规模的最小运行次数;
1、冒泡排序
原理(从小到大排序为例):
- 比较相邻的元素,如果第一个比第二个大,就交换;
- 对每一对相邻的元素做同样的工作,则序列最末尾为最大元素;
- 重复上述步骤除了最后一个;
- 每次需要比较的元素越来越少,直到没有数字需要比较
2、选择排序
原理:
- 在未排序的序列中找到最小(最大)元素,存放到排序序列的起始位置;
- 再从未排序元素中继续寻找最小(最大)元素,然后放到已排序列的末尾;
- 重复第二步直到所有元素排序完毕
3、插入排序
原理 :
- 起始时认为第一个元素已排序,取出未排序序列的第一个元素;
- 在已排序序列中从后向前扫描,若已排序元素大于新元素则将已排序元素移入下一位置;
- 重复上述步骤,直到找到已排序元素小于或等于新元素的位置,新元素插入该位置后;
- 重复上述步骤,直到所有元素都完成排序 ;
分治法:
典型应用:二分法(必须为有序序列)、归并排序、快速排序
适用情况:1)问题规模足够小的时候能够解决;2)该问题可以划分为规模比较小的若干问题;3)子问题的解合并是原来问题的解;4)各个子问题相互独立;
4、归并排序
原理:
- 把长度为n的序列分为两个长度为n/2的子序列;
- 对这两个子序列分别进行归并排序;
- 将两个排序好的子序列合并成一个最终的排序序列;
5、快速排序
原理:
- 从数列中挑选出一个元素作为基准元素(通常选择第一个);
- 分区:将剩余元素中比基准元素小的放在该元素前面,比基准元素大的放在该元素后面;
- 递归:对小于基准元素的子序列和大于基准元素的子序列分别进行快速排序;
6、堆排序
利用堆这种数据结构所设计的一种排序算法;堆积是一个近似完全二叉树的结构,同时满足堆积的性质:即子节点的键值或索引总是小于(大顶堆)【或大于(小顶堆)】它的父节点;
原理:
- 将初始待排序关键字序列(R1,R2,……,Rn)构建成大顶堆,此堆为初始的无序区;
- 将堆顶元素R1与最后一个元素Rn交换,得到新的无序区(R1,R2,……,Rn-1)和新的有序区(Rn),且满足R[1,2,……,n-1]<=Rn;
- 再次将新的无序堆构建为大顶堆,将R1与Rn-1交换,得到新的无序区 (R1,R2,……,Rn-2)和新的有序区(Rn-1,Rn);
- 重复整个过程;