本人处于初学阶段,如有哪个地方分析的不对,希望指正。
1> 选择排序
(1) 时间复杂度:O(n^2);
(2) 稳定性:不稳定;
(3) 额外空间:O(1);
2> 冒泡排序
(1) 时间复杂度:O(n^2);
(2) 稳定性:稳定;
(3) 额外空间:O(1);
(4) 代码优化:通过对第二层循环的优化(判断有没有进入交换部分的代码,如果没有则说明有序),降低序列近乎有序时代码的时间复杂度。
3> 插入排序
(1) 时间复杂度:O(n^2);
(2) 稳定性:稳定;
(3) 额外空间:O(1);
(4) 代码优化:通过将内层循环交换的操作变为赋值操作,实现优化代码的运行效率。
4> 希尔排序
(1) 时间复杂度:O(n^(1.3);
(2) 稳定性:不稳定;
(3) 额外空间:O(1);
5> 快速排序
(1) 时间复杂度:O(nlogn);
(2) 稳定性:不稳定;
(3) 额外空间:O(logn);
(4) 代码优化:
1) 选取参考索引的时候采用随机选取,不然最坏情况时间复杂度退 化为O(n^2);
2) 在循环找中间位置的时候从两头出发,当数据近乎有序的时候可 以大大提高运行效率;
3) 当数据中有大量重复值时,可以采用三路快排,大大提高了代码 的运行效率;
6> 归并排序
(1) 时间复杂度:O(nlogn);
(2) 稳定性:稳定;
(3) 额外空间:O(n);
(4) 代码优化:当排序为链表等复杂数据结构时可以采用从顶向下的非递归归并排 序,省去索引部分,可以用于链表排序;
7> 堆排序
(1) 时间复杂度:O(nlogn);
(2) 稳定性:不稳定;
(3) 额外空间:O(1);
(4) 代码优化:
1) 采用插一个元素调整堆结构的方法(shiftUp()),然后用(shiftDown()) 取出;算法复杂度 :O(nlogn);
2) (heapify)直接在原数组中操作,然后用shiftDown()对 非叶子节点 进行调整得到堆,然后进行排序;算法复杂度为 O(n);
(5) 堆中数组下标从1开始的不是叶子节点的个数等于 总结点除2;