经典排序算法——快速排序
核心算法——分区算法
- 在数组中确定一个主元,然后对数组进行操作,使主元左边的元素都小于等于主元,主元右边的元素都大于主元。
基本步骤
- 使用分区算法并找出主元
- 对主元两边的序列分别进行排序
算法复杂度
整体时间复杂度 O(nlog n)
public class QuickSort{
public static void sort(int[] a, int l, int r){
if(l < r){
//1.分区
int p = partition(a,l,r);
//2.对主元两边序列进行排序
sort(a,l,p);
sort(a,p+1,r);
}
}
//分区算法
public static int partition(int[] a, int l, int r){
//三点中值法 对分区算法进行优化
int mid = (l+r)>>1;//中间下标
int midValueIndex = -1;//中值下标
if(a[l] < a[mid] && a[l] > a[r]) {
midValueIndex = l;
}else if(a[l] > a[mid] && a[l] < a[r]) {
midValueIndex = l;
}else if(a[r] > a[mid] && a[r] < a[l]) {
midValueIndex = r;
}else if(a[r] < a[mid] && a[r] > a[l]) {
midValueIndex = r;
}else midValueIndex = mid;
swap(a,l,midValueIndex);
//分区
int pivot = a[l]; //主元
int lp = l+1; //左指针
int rp = r; //右指针
while(lp <= rp){
//左指针指向元素比主元小,左指针右移
while(lp <= rp && a[lp] <= pivot) lp++;
//有指针指向元素比主元大,右指针左移
while(lp <= rp && a[rp] > pivot) rp--;
if(lp > rp) return rp;
swap(a,lp,rp);
}
swap(a,l,rp);
//此时,右指针指向主元
return rp;
}
public static void swap(int[] a, int i, int j) {
// TODO Auto-generated method stub
int temp = a[i];
a[i] = a[j];
a[i] = temp;
}
}