import java.util.Random;
public class QuickSork {
//TODO 变量名一定要统一
private final static int cutoff=10;//插入排序界限
public static void main(String[] args) {
// TODO Auto-generated method stub
Random random = new Random();
int array2[] = new int [100];
for (int i = 0; i < array2.length; i++) {
array2[i]= random.nextInt(100);
}
for (int i = 0; i < array2.length; i++) {
System.out.print(array2[i]+" ");
}
System.out.println();
QuickSort(array2);
for (int i = 0; i < array2.length; i++) {
System.out.print(array2[i]+" ");
}
System.out.print("#");
}
static void QuickSort(int[] array){
if(array==null) return ;
Qsort(array,0,array.length-1);
//递归调用
}
static int median3(int[] array, int l, int r){
//取三个数的中间值,得到了 left<mid<right
//将pivot 放在right- 1 的位置 ,能减少排序的次数
int m=(l+r)/2;
if(array[l]>array[m]){
int temp = array[l];
array[l]=array[m];
array[m]=temp;
}
if(array[l]>array[r]){
int temp =array[l];
array[l]=array[r];
array[r]=temp;
}
//此时 l 上的元素是最小的
if(array[m]>array[r]){
int temp = array[m];
array[m]=array[r];
array[r]=temp;
}
// 将pivot 放在r-1的位置上
int temp=array[m];
array[m]=array[r-1];
array[r-1]=temp;
return temp;
}
private static void Qsort(int[] array,final int left,final int right){
if(left+cutoff<right){
//将枢纽元放在了right - 1 的位置上
int pivot = median3(array,left,right);
int l=left,r=right-1;
while(true){//因为经过了 meidian3 的处理,得到了 left<mid<right 的序列 ,相当于有了两个哨兵
//先移动在比较,因为如果先比较的话可能会导致死循环
while(array[++l]<pivot){
}
while(array[--r]>pivot){
}
if(l<r){//控制条件
int temp=array[l];
array[l]=array[r];
array[r]=temp;
}else{
break;
}
}
int temp=array[l];
array[l]=array[right-1];
array[right-1]=temp;
Qsort(array,left,l-1);
Qsort(array,l+1,right);
}else{
//选择排序或者希尔排序
//TODO 应该统一接口
InsertSort.InsertSort(array, left, right);
}
}
}
数据结构之快排
最新推荐文章于 2022-09-05 14:23:08 发布