如何选择一种排序算法
算法的执行效率
- 最好、最坏、平均时间复杂度:需要根据要排序数据的大小、以及是否接近有序来考虑时间复杂度。
- 考虑时间复杂度的系数、常量、低阶:对于通一时间复杂度的数据要考虑这些。
- 比较次数和交换次数:基于比较的排序涉及到数据的交换所以要考虑比较次数和交换次数。
算法的内存消耗
原地排序指空间复杂度是O(1)的排序,我们在选择的时候也要针对硬件考虑算法的空间复杂度
算法的稳定性
指如果数据有俩个相等的元素,当排序后者俩个相等元素之间的顺序没发生改变,我们管他叫稳定的排序。相反则是不稳定的排序。
算法稳定性的意义以及用法,对于一个对象按照俩个属性维度排序。如:对于一个账户的金额排序,金额相等的按照时间倒序。
- 我们可以先按照时间倒叙排序,得到时间倒叙排序的列表;
用稳定性排序算法按照金额大小进行排序,由于是稳定性的排序算法所以金额相等的数据原有顺序不变依然是时间倒叙。
规律:先按照第二个属性排序(即xx相等,按照xx排序),在按照第一个属性排序。
算法的有序度和逆序度
一个数组中,有顺序的元素个数较为有序度。相反,则成为逆序度。一个完全有序的数据我们称他为满有序度。公式是:逆序度=满有序度-有序度。
排序实际上是减少逆序度最终达到满有序度的过程
冒泡排序
1 | public class BubbleSort { |
算法分析
时间复杂度:最好的情况是数组完全有序,只做一次循环就退出。最坏的时间复杂度是O(n*n),完全倒序需要都交换一次。
空间复杂度:相邻俩个元素比较交换,没有用到额外的空间属于O(1)
算法稳定性:俩个元素相同,不交换位置所以是算法稳定。
注:如果不优化,时间复杂度就是O(n*n).
选择排序
选择排序,循环数组,每次都找到数组最小值,然后和当前元素互换位置,知道结束,
1 | public class SelectionSorts { |
选择排序-算法分析
时间复杂度:时间负责度最好O(nn),最坏O(nn),平均都是O(n*n)
空间复杂度:没有用到额外的空间属于O(1)
算法稳定性:不稳定每次都要交换位置,如果值相等也可能在交换后改变顺序
归并排序
1 | public void sort(int a[], int start, int end) { |
归并排序 算法分析
时间复杂度:时间负责度最好O(nlogn),最坏O(nnlogn),平均都是O(nnlogn)
空间复杂度:每次merge都需要开辟一块空间但是每次都释放掉,空间复杂度就是O(n)
算法稳定性:稳定
快速排序
1 | /** |