目录
一.本文关注焦点
二.七大排序分析及相关实现
1.冒泡排序
2.简单选择排序
3.直接插入排序
4.希尔排序
5.堆排序
编辑
6.归并排序
7.快速排序
一.本文关注焦点
各种排序的代码实现及各自的时间空间复杂度分析及稳定性。
时间复杂度:在比较排序中主要指排序中两数比较交换次数
空间复杂度:在比较排序中指除原来存储数据开辟的空间外在排序过程又开辟的其它空间
时间复杂与空间复杂度计算自行学习:
时间复杂度和空间复杂度(超详细)-CSDN博客
稳定性:指排序过程中数据的相对位置是否发生改变
介绍如下图:
当前未排序时黑色5在红色5之前,若排序后黑5仍然在红5之前,即二者的相对位置未发生改变,则该排序稳定,否则称该排序不稳定。
需要注意的是:稳定排序可更改为不稳定排序,而不稳定排序一定是不稳定排序
二.七大排序分析及相关实现
1.冒泡排序
冒泡排序动图:
https://i-blog.csdnimg.cn/direct/068c355a675c4d16918587bbab62ea53.gif
此冒泡排序还能继续进行优化
空间复杂度分析:除为存储数组开辟空间外,在排序过程中只开辟一个辅助空间因此为O(1)。
时间复杂度:
最坏:
将内外循环完全进行
最好:
序列已经有序经优化后只进行一趟比较可达O(n).
稳定性: 稳定
交换时等于并未进行交换,保持了数据的相对位置不变。
2.简单选择排序
动图:
https://i-blog.csdnimg.cn/blog_migrate/e6eeb7ba10b2d32e4f3fb4efa470e01e.gif
空间复杂度:除存放数据数组外排序过程只开辟minIndex用来记录最小下标所以为O(1)。
时间复杂度:
最坏:
(n-1)+(n-2)+........+1 = n^2/2所以为O(n^2);
最好:
及时数据有序仍然需要进行比较所以仍然为O(n^2);
稳定性:稳定
此处比较不是<= 确保排序的稳定
3.直接插入排序
直接插入排序动图演示:
https://i-blog.csdnimg.cn/direct/5245b6cc9d6345398db1515e31632477.gif#pic_center
空间复杂度:除存储数组本身数据外只取一tamp空间所以为O(1)
时间复杂度:
最坏:
逆序时每次排序都要与有序区间数字全部比较一遍。
1+2+3+......+(n-2)+(n-1)=n^2/2所以复杂度为O(n^2)
最好:
已经有序时
每次排序只需比较一次
1+1+1+...+1 = n-1所以为O(n)
稳定性:稳定
此处为>,不会使相同元素的相对位置发生改变。
4.希尔排序
希尔排序动图:
https://i-blog.csdnimg.cn/blog_migrate/420f5c5abac4bb459aaee2f95aaaf35f.gif
希尔排序可看做是直接插入排序的优化
空间复杂度:
空间复杂度:除存储数组本身数据外只取一tamp空间所以为O(1)
时间复杂度:通常为O(n^1.3)~O(n^2)
最坏:O(n^2)非常少见
最好:O(nlogn)
稳定性:不稳定
希尔排序为跳跃式分组排序,排序后相同元素相对位置可能发生改变
5.堆排序
堆排序动态演示:
https://i-blog.csdnimg.cn/direct/a94c12bdf4fe4e03bfdf54a9a5aca3fe.gif#pic_center
此处1314送给各位看官。。
空间复杂度:排序过程中除存储数组本身数据外不取其它额外空间所以为O(1)
时间复杂度:
最坏:O(nlogn)
最好:O(nlogn)
堆排序的时间复杂度只与创建堆与调整堆有关与数据顺序无关
创建堆时每个非叶子结点最多进行两次交换因此其时间复杂度为O(n)
排序时每次调整堆的时间复杂度为logn,需要调整n-1次所以时间复杂度为O(nlogn)
总体为(O(n+1)logn)也就是O(nlogn).
稳定性:不稳定
6.归并排序
动画演示:
https://i-blog.csdnimg.cn/direct/cc1443bd7a3348f39013f146a3c1f1ca.gif#pic_center
空间复杂度:除本身为存储数组开辟空间外,还需要开辟辅助空间tampArr最终长度为n,所以空间复杂度为O(n).
时间复杂度:
最坏:O(nlogn)
最好:O(nlogn)
因为归并排序递归分割过程相当于二叉树,树高计算为logn此时分割完成,合并阶段每层和并数组大小为m+n,则logn层可计算为O(nlogn).
稳定性:稳定
归并排序性能不受输入数据的影响且稳定,代价为空间。
7.快速排序
动态演示:
https://i-blog.csdnimg.cn/blog_migrate/88b8eb041f669690da648466be9d2ddb.gif
基本版本实现(挖坑法找基准):
Hoare法:
三数取中优化:
空间复杂度:只有递归调用栈占用空间
最坏:单分支数高度为n,所以复杂度为O(n).
最好:完全二叉树,树高为logn所以复杂度为O(logn)
时间复杂度:
最坏:单分支树,退化为冒泡排序O(n^2)
最好:完全二叉树树高为logn,每次需要比较两次要比较n次,所以时间复杂度为O(nlogn).
稳定性:不稳定