工程上对排序的改进,如java 的arrays.sort()

2020-07-15  本文已影响0人  Mr_Editor

工程上在进行排序的时候会区分值传递和引用传递,原因是为了保证稳定性:
1.如果是值传递,即基本数据类型,对排序稳定性没要求

  1. 如果是引用传递,即对象类型,排序之前不知道对稳定性有没有要求
  1. 稳定性的考虑

值传递 不关心稳定性 直接利用快排
引用传递 不知道是否需要保证稳定性 利用归并排序

  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;
    }

}
上一篇 下一篇

猜你喜欢

热点阅读