参考书:《java 数据结构与算法》 package sort; import java.util.Arrays; public class QuickSort { public static void main(String[] args) { // int arr[]={6,5,7,7,9,2,8,0,3,5}; // int arr[]={1,5,7,1,1,1,8,0,3,5};//重复数值 int arr[]={10,9,8,7,6,5,4,3,2,1}; partitionIt(arr,0,arr.length-1); // QuickSort(arr,0,arr.length-1 ); System.out.println (Arrays.toString(arr)); } /* 会造成重复比较 public static int partition(int[] arr,int left,int right){ int pivot=arr[right];//指向最后一个 int i=0; while(left<right){ i++; System.out.println("第"+i+"轮"); while(left<right&&(arr[left ]<pivot)){ left++; } while (left<right&&(arr[right]>=pivot)) { right--; } int temp =arr[left]; arr[left]=arr[right]; arr[right]=temp; System.out.println(" left=" + left +" right ="+right + " "+ Arrays.toString(arr)); // left++; } int temp =arr[left]; arr[left]=arr[right]; arr[right]=temp; System.out.println("left="+left); return left; }*/ public static int partitionIt(int[] arr,int left,int right){ // 为什么 j要加1 y因为 j从 --j 和++i 开始的 // 而基准元素选取第一个元素, 从第二个开始比较 int i= left ;//左游标 int j=right+1;//右游标 int prvoit=arr[left];//基准 int n=0; while (true){ System.out.println("第 "+(++n)+"轮"); /* // while (i<j&&( arr[++i]<prvoit)){ } // while (i<j&&(arr[--j])>prvoit){} */ while (i<right&&( arr[++i]<prvoit)){ System.out.println(" 左边扫描+ i="+i); } while (j>0&&(arr[--j])>prvoit){ System.out.println(" 右边扫描+j "+j); } if(i>=j){ System.out.println("退出扫描+ i"+i+"j"+j); break; } else{ System.out.println("元素交换前:i="+i+" j="+j); System.out.println(" i=" + i +" j ="+j + " "+ Arrays.toString(arr)); swap(arr,i,j); System.out.println("元素交换后:i="+i+" j="+j); System.out.println(" i=" + i +" j ="+j + " "+ Arrays.toString(arr)); } System.out.println(" i=" + i +" j ="+j + " "+ Arrays.toString(arr)); } System.out.println(" i=" + i +" j ="+j + " "+ Arrays.toString(arr)); System.out.println(" 准备与基准交换:"); System.out.println("交换前 i=" + i +" j ="+j + " "+ Arrays.toString(arr)); swap(arr,left,j); System.out.println("交换后 i=" + i +" j ="+j + " "+ Arrays.toString(arr)); return j; } public static void swap(int[] arr,int i,int j){ int temp =arr[i]; arr[i]=arr[j]; arr[j]=temp; } //递归 public static void QuickSort(int[] arr ,int left ,int right ){ if(left>=right){ return;//递归结束条件 } else{ int partition=partitionIt(arr,left,right);//基准位置 QuickSort(arr,left,partition-1);//左边 QuickSort(arr,partition+1,right);// 右边 } } }
int arr[]={1,5,7,1,1,1,8,0,3,5};
partitionIt(int[] arr,int left,int right)
i=left=0;
j=right+1=11
proit=arr[left]=1;
第 1轮
右边扫描+j 9
右边扫描+j 8
元素交换前:i=1 j=7
i=1 j =7 [1, 5, 7, 1, 1, 1, 8, 0, 3, 5]
i j
元素交换后:i=1 j=7
i=1 j =7 [1, 0, 7, 1, 1, 1, 8, 5, 3, 5]
i j
第 2轮
右边扫描+j 6
元素交换前:i=2 j=5
i=2 j =5 [1, 0, 7, 1, 1, 1, 8, 5, 3, 5]
i j
元素交换后:i=2 j=5
i=2 j =5 [1, 0, [1], 1, 1, [7], 8, 5, 3, 5]
i j
第 3轮
元素交换前:i=3 j=4
i=3 j =4 [1, 0, 1, 1, 1, 7, 8, 5, 3, 5]
i j
元素交换后:i=3 j=4
i=3 j =4 [1, 0, 1, 1, 1, 7, 8, 5, 3, 5]
第 4轮
退出扫描+ i=4j=3
i=4 j =3 [1, 0, 1, 1, 1, 7, 8, 5, 3, 5]
准备与基准交换:
交换前 i=4 j =3 [[1], 0, 1, 1, [1], 7, 8, 5, 3, 5]
交换后 i=4 j =3 [1, 0, 1, 1, 1, 7, 8, 5, 3, 5]
[1, 0, 1, 1, 1, 7, 8, 5, 3, 5]