尝试用java写一个快速排序算法,算法还是大二学的了,为了准备大三的面试,还是手打一遍看看bug。
1 package sort; 2 3 import java.util.Random; 4 5 public class QuickSort { 6 public static int[] quickSort(int[] arr,int L,int R) { 7 if(L>=R) { //bug 8 return arr; 9 } 10 int base=arr[L]; 11 int left=L; 12 int right=R; 13 while(left<right) { 14 if(arr[right]<base) { 15 arr[left]=arr[right]; 16 while(left<right) { 17 if(arr[left]>base) { 18 arr[right]=arr[left]; 19 break; 20 }else { 21 left++; 22 } 23 } 24 }else { 25 right--; 26 } 27 } 28 arr[left]=base; 29 arr=quickSort(arr,L,left); 30 arr=quickSort(arr,left+1,R); 31 return arr; 32 } 33 34 public static void main(String[] args) { 35 Random rd=new Random(); 36 int n=rd.nextInt(10)+5; 37 int[] arr= new int[n]; 38 for(int i1=0;i1<n;i1++) { 39 arr[i1]=rd.nextInt(100); 40 } 41 int[] arr1=quickSort(arr,0,arr.length-1); 42 for(int i=0;i<arr1.length;i++) { 43 System.out.print(arr1[i]+" "); 44 } 45 } 46 }
bug:第一次写的判断条件是if(L==R),偶尔会遇到数组下标越界的错误,经排查,错误原因与第30行有关。假设数组为{1,2},排序过程中L=0,R=1,并且left=right=1的时候,会进行第29和第30行的操作arr=quickSort(arr,L,left);arr=quickSort(arr,left+1,R); 第30行传入值的时候,left+1变成2,数组越界。