快速排序(随机打乱数组方法,好用)

本文思路来自《算法》第四版。

快速排序算法非常的脆弱,需要非常小心才能避免低劣的性能。

这里主要使用collections.shuffle(),集合的帮助类,来对数组进行随机乱序。

先简单贴上快排过程代码


    public void Sort(int[] sz, int lo, int hi){
        if(hi <= lo) return;
        int j = partition(sz, lo, hi);
        Sort(sz, lo, j-1);
        Sort(sz,j+1, hi);
    }
    public int partition(int[] sz, int lo, int hi){
        int i = lo, j = hi+1;//左右扫描指针
        int v = sz[lo];//切分元素
        while(true){
            //扫描左右,检查扫描是否结束并交换元素
            while(less(sz[++i], v)) if(i == hi) break;
            while(less(v, sz[--j])) if(j == lo) break;
            if(i >= j) break;
            exch(sz,i,j);
        }
        exch(sz,lo,j);
        return j;
    }
    public boolean less(int i, int v){
        if(i == v) return false;
        return i < v;
    }
    public void exch(int[] sz, int i, int j){
        int temp;
        temp = sz[i];
        sz[i] = sz[j];
        sz[j] = temp;
    }

这里的快速排序是左右指针的方法,没什么解释的。代码是模仿《算法》第四版的算法2.5例。

下面介绍我的乱序shi实现


public int[] change(String[] s,int N){
        int[] a = new int[N];
        List ls = new ArrayList<>(N);
        for(int i = 0; i< N; i++){
            ls.add(Integer.parseInt(s[i]));
        }
        Collections.shuffle(ls);
        for(int i =0; i< N;i++){
            a[i] = ls.get(i);
        }
        return a;
    }

思路也很简单,无非就是借用集合辅助类的这一功能,毕竟shuffle是效率hen很高的,比自实现的随机方法要强很多

如此乱序数组,便可以更加优秀的将快排性能接近NlogN,而且几乎可以避免chu出现n2的效率情况。

你可能感兴趣的:(排序)