2.快速排序Java实现

public class QuickSortSolution{
	//对array[l,r]排序
	public static void quickSort(int [] array,int l,int r){
		//只剩一个元素或者l>r时完成了排序
		if(l>=r){
			return ;
		}
		//找锚定点	,pivot所对应的结点已经在正确的位置上
		int pivot = sortThreeWays(array,l,r);
		//int pivot =sortTwoWays(array,l,r);
		quickSort(array,l,pivot-1);
		quickSort(array,pivot+1,r);
	}
	/**
	 * 两路归并排序:对array[l,r]进行快排
	 * @param array
	 * @param l
	 * @param r
	 * @return
	 */
	private static int sortTwoWays(int[] array,int l,int r){
		int p = (int)(Math.random()*(r-l)+l);
		swap(array,p,l);
		//i指向标定点的后一个,j指向最后一个元素
		int i=l+1,j=r;
		int v=array[l];
		while(true){
			//当左边的比v小,移动i,直到找到一个比自己大或相等的元素
			while(i<=r&&array[i]<v){
				i++;
			}
			//当右边的比v大,向左移动j,直到找到一个比自己小或相等的元素
			while(j>=l+1&&array[j]>v){
				j--;
			}
			//搜索完毕了
			if(i>j){
				break;
			}
			swap(array,i,j);
			//交换后继续探索
			i++;
			j--;
		}
		swap(array,l,j);
		return j;
	}
	/**
	 * 三路归并排序,用于应对大部分元素都是一样的情况
	 * //arr[l+1,lt]<v,arr[lt,i)=v,arr[gt,r]>v
	 * @param array
	 * @param l
	 * @param r
	 * @return
	 */
	private static int sortThreeWays(int[] array,int l,int r){
		int p = (int)(Math.random()*(r-l)+l);
		swap(array,p,l);
		int lt=l,i=l+1,gt=r+1;//arr[l+1,lt]<v,arr[lt,i)=v,arr[gt,r]>v,i是正在观测的结点
		int v=array[l];
		while(true){
			if(i<gt){
				if(array[i]<v){
					swap(array,i,lt+1);
					lt++;
					i++;
				}else if(array[i]>v){
					gt--;
					swap(array,i,gt);
				}else{
					i++;
				}
			}else{
				break;
			}
		}
        //交换l与lt,使array[l]融入array[lt,i)的部分,也就是融入等于v的部分
		swap(array,l,lt);
		return lt;
	}
	public static void swap(int[] array,int i,int j){
		int t = array[i];
		array[i]=array[j];
		array[j]=t;
	}
	public static void main(String[] args) {
		int[] array = new int [10];
		for(int i=0;i<10;i++){
			array[i]=(int)(Math.random()*10);
		}
		quickSort(array, 0, array.length-1);
		System.out.println(Arrays.toString(array));
	}
	
}

猜你喜欢

转载自blog.csdn.net/cl723401/article/details/88101793
今日推荐