排序算法简介
有关概念
排序:将杂乱无章的数据元素,通过一定的方法按关键字顺序排列的过程叫做排序。
排序算法的稳定性:
- 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。
- 不稳定:如果a原本在b前面,而a=b,排序之后a有可能会出现在b的后面。
内排序:所有排序操作都在内存中完成。
外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行。
时间复杂度:描述算法运行时间的函数,用大O符号表述;对排序数据的总的操作次数反映当Ñ变化时,操作次数呈现什么规律。
空间复杂度:描述算法所需要的内存空间大小。是指算法在计算机内执行时所需存储空间的度量,它也是数据规模Ñ的函数。
排序算法的分类
非线性时间比较类排序和线性时间非比较类排序
- 非线性时间比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此称为非线性时间比较类排序。
- 线性时间非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此称为线性时间非比较类排序。
比较和非比较排序的区别
比较排序:在排序的最终结果里,元素之间的次序依赖于它们之间的比较。每个数都必须和其他数进行比较,才能确定自己的位置。
优势:适用于各种规模的数据,也不在乎数据的分布,都能进行排序。可以说,比较排序适用于一切需要排序的情况。
劣势:时间复杂度较高
非比较排序:通过确定每个元素之前,应该有多少个元素来排序。针对数组arr,计算arr[i]之前有多少个元素,则唯一确定了arr[i]在排序后数组中的位置。只要确定每个元素之前的已有的元素个数即可,所有一次遍历即可解决。算法时间复杂度O(n)。
优势:时间复杂度低
劣势:由于非比较排序需要占用空间来确定唯一的位置。所以对数据规模和数据分布有一定的要求。
常用算法规律
n:数据规模;k:"桶"的个数;In-place:内排序;Out-place:外排序
常用的排序算法
交换两个元素的位置
在排序算法中经常使用在数组中交换两个元素的位置,所以封装一个方法,以便调用
后续的排序算法会用到
/**
* 功能描述:交换两个元素在数组中的位置
*/
public static void swap(int[] arr, int i, int j) {
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
这种方式不理解参看我的另一篇博客:(Java版)算法——交换两个基本数据类型的变量值和数组中元素调换位置
后续不断更新排序算法……