数据结构
排序算法
术语介绍
- 稳定排序:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;
- 非稳定排序:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面;
- 内排序:所有排序操作都在内存中完成;
- 外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;
- 时间复杂度:排序所耗费的时间;
- 空间复杂度:排序所耗费的内存;
- 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。
- 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。
排序介绍
总结:
- 时间复杂度(平均):
- O( n^1.3 ):希尔
- O( n^2 ):插入、选择、冒泡
- O( nlog2(n) ):堆、快速、归并
- O( n + k ):计数、桶
- O( n * k ):基数排序
冒泡排序
思想:每次寻找一组数据中最大的元素,两两比较,找到后放到数据的最后一位。n个数据第一次两两比较n-1次。第二次比较n-2次,比较的时候如果前一个元素比第二个元素大则相互交换。总共两层循环:第一层代表需对比几轮;第二层代表需要两两对比多少次
优点:比较基础,简单实用易于理解。
缺点:比较次数多,效率较低。
快速排序
思想:先找到一个基准点(一般指数组的中部),然后数组被该基准点分为两部分,依次与该基准点数据比较,如果比它小,放左边;反之,放右边。左右分别用一个空数组去存储比较后的数据。最后递归执行上述操作,直到数组长度 <= 1;
优点:速度快,常用
缺点:需要另外声明两个数组,浪费了内存空间资源
归并排序
思想:排序一个数组,先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了