快速排序也属于交换排序,
基本原理就是每一轮选择一个基准元素(pivot),大于pivot的元素放右边,小于pivot 的元素放左边 ,把数列拆分成两部分--即分治法的思路
不明白的地方debug跟踪一下慢慢理解..
int[] arr=new int[8];
for (int i=0;i<8;i++){
arr[i]=(int)(Math.random()*100);
}
System.out.println("===="+Arrays.toString(arr));
quick(arr,0,arr.length-1);
System.out.println("-------------"+ Arrays.toString(arr));
}
public static void quick(int[] arr,int left,int right){
int l = left;//左下标
int r=right; //右下标
int temp=0; //临时变量,交换元素
int pivot=arr[(left+right)/2]; //基准值
System.out.println("pivot:"+pivot);
//while 循环的目的是让比pivot小的放左边,比pivot大的放右边
while (l < r){
//在pivot左边一直找,找到大于等于pivot值退出
while(arr[l] < pivot){
l+=1;
}
//在pivot右边一直找,找到大于等于pivot值退出
while (arr[r] > pivot){
r-=1;
}
//l>r 说明元素完成交换,左边全是小于pivot的值,右边全是大于等于pivot的值
if(l>=r){
break;
}
//交换元素
temp=arr[l];
arr[l]=arr[r];
arr[r]=temp;
//完成交换后,如果arr[l]==pivot r下标前移
if(arr[l] == pivot){
System.out.println(arr[l]+"LLLLLLLLLLLLLLLL"+pivot);
r-=1;
}
//如果完成交换,发现arr[r]==pivot ,l下标后移
if(arr[r]==pivot){
System.out.println(arr[r]+"RRRRRRRRRRRRRRRRR"+pivot);
l+=1;
}
}
//如果l==r 各自前进一步,避免栈溢出
if(l==r){
l+=1;
r-=1;
}
//向左递归
if (left < r){
quick(arr,left,r);
}
//向右递归
if (right > l){
quick(arr,l,right);
}
}