快排的3种方式

avatar
作者
猴君
阅读量:6
//(前两种时间复杂度为o(n^2) , 最后一种为o(n*logn)  public static void swap(int[] arr , int i , int j){     arr[i] =arr[i] ^arr[j];     arr[j] =arr[i] ^arr[j];     arr[i] =arr[i] ^arr[j]; } //使数组中以arr[R]划分,返回循环后arr[R]的所在地 public static int partition(int[] arr , int L ,int R ){     if(L >R ){         return -1;     }     if(L == R ){         return L;     }     int lessEqual = L-1;     int index = L;     while (index <R ){         if(arr[index] <=arr[R]){             swap(arr ,index++ , ++lessEqual);         }     }     swap(arr , ++lessEqual , R);     return lessEqual; }  //把一个数组以arr[R]划分,返回的是值为arr[R]的区间 public static int[] netherlandsFlag(int[] arr , int L , int R){     if(L>R){         return new int[] { -1 ,-1};     }     if(L ==R){         return new int[] {L ,R};     }     int less = L-1;     int more =R;     int index = L;     while (index <more){         if(arr[index] ==arr[R]){             index++;         }else if(arr[index] <arr[R]){             swap(arr ,index++ , ++less);         }else{             swap(arr ,index , --more);         }     }     swap(arr ,more ,R );     return new int[] {less+1 , more}; } //递归1 public static void process1(int[] arr ,int L ,int R ){     if(L >=R){         return;     }     int M =partition(arr ,L ,R);     process1(arr , L , M-1);     process1(arr , M+1 ,R); } //快排1 public static void quickSort1(int[] arr){     if(arr ==null || arr.length <2){         return;     }     process1(arr ,0 , arr.length-1); }  //递归2 public static void process2(int[] arr ,int L ,int R){     if(L >=R){         return;     }     int[] equalArea =netherlandsFlag(arr ,L ,R);     process2(arr ,L ,equalArea[0] -1);     process2(arr , equalArea[1] , R); } //快排2 public static void quickSort2(int[] arr){     if(arr ==null || arr.length <2){         return;     }     process2(arr ,0 , arr.length-1); }  //递归3 public static void process3(int[] arr , int L ,int R){     if(L > R ){         return;     }     swap(arr ,L + (int) (Math.random() * (R - L+1)), R);     int[] equalArea = netherlandsFlag(arr , L ,R);     process3(arr , L , equalArea[0] -1);     process3(arr , equalArea[1] +1, R ); } //快排3 public static void quickSort3(int[] arr){     if(arr == null ||arr.length <2){         return;     }     process3(arr , 0  , arr.length-1); }

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!