java sort排序原理
简介:
的的 事实上Collections.sort方法底层就是调用的Arrays.sort方法,而Arrays.sort使用了两种排序方法,快速排序和优化的归并排序。 快速排序主要是对那些基本类型数据(int,short,long等)排序, 而归并排序用于对Object类型进行排序。
使用不同类型的排序算法主要是由于快速排序是不稳定的,而归并排序是稳定的。这里的稳定是指比较相等的数据在排序之后仍然按照排序之前的前后顺序排列。对于基本数据类型,稳定性没有意义,而对于Object类型,稳定性是比较重要的,因为对象相等的判断可能只是判断关键属性,最好保持相等对象的非关键属性的顺序与排序前一致;另外一个原因是由于归并排序相对而言比较次数比快速排序少,移动(对象引用的移动)次数比快速排序多,而对于对象来说,比较一般比移动耗时。
此外,对大数组排序。
快速排序的sort()采用递归实现,
数组规模太大时会发生堆栈溢出,而归并排序sort()采用非递归实现,不存在此问题。
接下来看代码:
简单数组接下来去看sort源码
将指定的数组按升序排序 接下来继续点进去
在这里会对传入进来了数组进行判断,判断数组量的大小
if (right - left < QUICKSORT_THRESHOLD) 判断快速排序的阈值
因为做的是小数据 . 所以继续
当数据量小的时候通过双轴快速排序对数组的指定范围进行排序。
接下来我们自己手写一个排序.
public class wirteSort {
/**
*
* @param 手写的sort排序 --sort方法实现对 小型int数据的剖析
* @return
* @author Mr.Yao
* date 2019-06-03 9:26
* 总结:
*/
public static void main(String[] args) {
//定义一个数组
int [] a =new int[]{9,8,7,6,5,4,3,2,1};
//数组最左边
int left=0;
//数组的数据量大小
int right=a.length-1;
//数组的长度
int length=a.length;
System.out.println("数组最左边:"+left);
System.out.println("数组的数据量大小:"+right);
System.out.println("数组的长度:"+length);
/**
*
* @param 小型数组的遍历方法
* @return
* @author Mr.Yao
* date 2019-06-03 9:34
*/
//i为数组的初始值;j初始为i; i<数据量 j做自增
for (int i = left, j = i; i < right; j = ++i) {
//下标+1 获取下一个数组的数据
int ai = a[i + 1];
//当下个数组小于当前数组的时候
while (ai < a[j]) {
System.out.println(a[j]);
a[j + 1] = a[j];
if (j-- == left) {
break;
}
}
a[j + 1] = ai;
}
for (int i=0;i<a.length;i++){
System.out.print(a[i]+"\t\t");
}
}
}
总结:
首先先判断需要排序的数据量是否大于60。
小于60:使用插入排序,插入排序是稳定的
大于60的数据量会根据数据类型选择排序方式:
基本类型:使用快速排序。因为基本类型。1、2都是指向同一个常量池不需要考虑稳定性。
Object类型:使用归并排序。因为归并排序具有稳定性。
注意:不管是快速排序还是归并排序。在二分的时候小于60的数据量依旧会使用插入排序