【2020假期复习】
一组数据,
3 5 8 1 2 6 9 4 7 6
预期用快速排序的过程如下:(以最末索引为pivot)
①
3 5 8 1 2 6 9 4 7 6
② 3 5 4 1 2 6 9 8 7 6 //交换8 、4
③3 5 4 1 2 6 6 8 7 9 //交换9、6
④交换 3 5 4 1 2 6 结果不变
⑤交换3 5 4 1 2
1 5 4 3 2 //交换3、1
1 2 4 3 5 //交换5、2
⑥start sort :1
start sort :4 3 5
start sort :4 3
3 4 //交换4、3
start sort : 4
⑦start sort :8 7 9
start sort : 8 7
7 8 //交换8、7
start sort :
8
result is: 1 2 3 4 5 6 6 7 8 9
以下为实现:(此法不会更改相同value的相对顺序)
import java.io.*; import java.util.*; class FastSort { public static void main(String[] args) throws Exception { int[] array={3,5,8,1,2,6,9,4,7,6}; sort(array,0,array.length-1); println(array); } private static void println(int[] arr) { for(int i:arr) System.out.print(" "+i); System.out.println(); } public static boolean sort(int[] src,int leftArg,int rightArg) throws Exception { System.out.println("start sort :"); println(src); if(src.length==1) return true; if(leftArg>=src.length-1||rightArg<leftArg) return true; //副本 int[] array=new int[src.length]; System.arraycopy(src,0,array,0,src.length); int pivot=array[array.length-1]; int left=leftArg; int right=rightArg; while(left<array.length) { int leftValue=array[left]; if(leftValue<=pivot) left++; else break; } //left的value全都小于Pivot if(left==array.length) { int[] leftArray=new int[array.length-1]; System.arraycopy(array,0,leftArray,0,array.length-1); if(sort(leftArray,0,leftArray.length-2)) { //覆盖原数组 System.arraycopy(leftArray,0,src,0,leftArray.length); src[src.length-1]=array[array.length-1]; System.out.print("result is "); println(src); return true; } throw new Exception("left array sorted failed !"+ leftArray); } else //leftvalue>pivot { //移动right; while(right>left) { int rightValue=array[right]; if(rightValue>=pivot) right--; else break; } if(right<=left) { //交换leftvalue和pivot int leftValue=array[left]; array[left]=pivot; array[array.length-1]=leftValue; System.out.print("switch left with pivot"); println(array); //0~ left-1 重排序 int[] leftArray=new int[left]; System.arraycopy(array,0,leftArray,0,left); if(!sort(leftArray,0,leftArray.length-2)) throw new Exception("left array sorted failed !"+ leftArray); //left+1 ~ end 重排序 int[] rightArray=new int[array.length-left-1]; System.arraycopy(array,left+1,rightArray,0,array.length-left-1); if(!sort(rightArray,0,rightArray.length-2)) throw new Exception("left array sorted failed !"+ rightArray); System.arraycopy(leftArray,0,src,0,leftArray.length); System.arraycopy(rightArray,0,src,left+1,rightArray.length); src[left]=array[left]; System.out.print("result is "); println(src); return true; }else { //rightValue<pivot //交换leftvalue rightvalue int leftValue=array[left]; array[left]=array[right];; array[right]=leftValue; System.out.print("switch left and right"); println(array); if(!sort(array,left+1,right-1)) throw new Exception("left array sorted failed !"+ array); System.arraycopy(array,0,src,0,src.length); System.out.print("result is "); println(src); return true; } } } }