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));
}
}
2.快速排序Java实现
猜你喜欢
转载自blog.csdn.net/cl723401/article/details/88101793
今日推荐
周排行