工程上在进行排序的时候会区分值传递和引用传递,原因是为了保证稳定性:
1.如果是值传递,即基本数据类型,对排序稳定性没要求
- 如果是引用传递,即对象类型,排序之前不知道对稳定性有没有要求
- 工程上对排序的改进的两个方面
- 稳定性的考虑
值传递 不关心稳定性 直接利用快排
引用传递 不知道是否需要保证稳定性 利用归并排序
- 充分利用O(N*logN)和O(N2)的有优势
快排 (O(N*logN)) + 插入 ,如代码中所示,在进行排序的过程中,如果L - R之间的数据数量不够60个,则会直接使用插入排序(O(N2)),这是因为利用常数项优势,即60的平方并不是很大,再结合快排的调度优势进行优化。
package Algorithm;
public class QuickSort1 {
void quickSort(int[] arr){
if(arr==null || arr.length < 2){
return ;
}
process1(arr,0,arr.length -1);
}
private void process1(int[] arr, int L, int R) {
if(L >=R){
return ;
}
if(L+60>R){//L .... R 不够60个数
//直接做L -R上的插入排序
return ;
}
int M = partition(arr,L ,R);
process1(arr,L ,M-1);
process1(arr,M+1,R);
}
private int partition(int[] arr, int l, int r) {
return 0;
}
}
网友评论