经典排序算法——快速排序

经典排序算法——快速排序

核心算法——分区算法

  • 在数组中确定一个主元,然后对数组进行操作,使主元左边的元素都小于等于主元,主元右边的元素都大于主元。

基本步骤

  1. 使用分区算法并找出主元
  2. 对主元两边的序列分别进行排序

算法复杂度

整体时间复杂度 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;
	}
	
}
点赞