快速排序
快速排序算法核心思想
快速排序是通过每一次通过改变数组中元素的次序来确定一个位置的元素,然后经过迭代使所有的元素都处在正确的位置上
快速排序(简易版)
//主体部分,迭代进行快速排序
public static void sort(Comparable[] a,int lo,int hi) {
if(hi<=lo)return;
int mid=split(a,lo,hi);
sort(a,lo,mid-1);
sort(a,mid+1,hi);
}
//切分方法,来确认一个元素处在正确的位置上
public static int split(Comparable[] a,int lo,int hi) {
Comparable v=a[lo];
int i=lo;
int j=hi+1;
/*
*从数组两边扫描元素,保证左边扫描后的都是比第一个元素小,同理,右边的要比第一个元素大
*如果遇到左边的比较大,而且此时右边扫描到一个元素比较小,则交换元素
*最后交换第一个元素和j位置的元素
*/
while(true) {
while(AllSort.less(a[++i], v))if(i==hi)break;//从左到右扫描,有比v大的就继续下一步
while(AllSort.less(v,a[--j]))if(j==lo)break;
if(i>=j)break;
//exch为交换元素位置的方法,可以看之前的博客
AllSort.exch(a, i, j);
}
AllSort.exch(a, lo, j);
return j;
}
三向切分快速排序
考虑到排序中会有重复的元素,为了避免不必要的比较,提高算法的性能,每次在不对重复的元素进行再排序
public static void sort(Comparable[] a,int lo,int hi) {
int i=lo;
int j=lo+1;
int k=hi;
if(hi<=lo)return;
Comparable v=a[lo];
while(j<=k) {
int te=v.compareTo(a[j]);
if(te>0)AllSort.exch(a, i++, j++);
else if(te<0)AllSort.exch(a, j, k--);
else j++;
}
sort(a,lo,i-1);
sort(a,k+1,hi);
}