本文思路来自《算法》第四版。
快速排序算法非常的脆弱,需要非常小心才能避免低劣的性能。
这里主要使用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<Integer> 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的效率情况。