雙軸快排
java中Arrays.sort中的排序方法就是雙軸快排
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI2EzX4xSZz91ZsAzNfRHLGZkRGZkRfJ3bs92YsAjMfVmepNHLuVzVhVTeiVDOtEWN50CT2IWb0UDW5pkNBJTN1IVchZTQClGVF5UMR9Fd4VGdsATNfd3bkFGazxSUhxGatJGbwhFT1Y0Mk9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLjljMwkzN0QjZzcTNmVzY4ImY0QTMjRzMiJjNzEDMmV2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
public class DualPivotQuicksort {
public static void sort(Comparable[] arr ,int start , int end){
if(start >= end)return;
if(greater(arr[start] , arr[end]) > 0){
exchange(arr,start,end);
}
/**
* j就是用來移動周遊比較該數字應該存放的空間
* i最後就是比start大的比end小的區間的開始下标
* k最後就是比start大的比end小的區間的結束下标
*/
int i = start +1;
int j = start +1;
int k = end - 1;
while (j <= k){
if(greater(arr[j],arr[start]) < 0){
exchange(arr, j,i);
i++;
j++;
continue;
}
if(greater(arr[j],arr[end]) > 0){
exchange(arr,j,k);
k--;
continue;
}
if(greater(arr[j] , arr[start]) >= 0 && greater(arr[j] , arr[end]) <= 0){
j++;
continue;
}
}
/**
* 把第一個基準值放在i的前面
* 最後一個基準值放在j的後面
* (i,j)就是比剛開始的i大但是比剛開始的j小
*/
exchange(arr,start,i -1);
exchange(arr,end,k+1);
/**
* 現在就會出來五個部分
* (0,i-1-1)
* i-1
* (i,k)
* k + 1 (也就是j)
* (k+1+1,end)
* 對這五個部分分别遞歸排序
*/
sort(arr,start,i-1-1);
sort(arr,i,k);
sort(arr,k+1+1,end);
}
private static void exchange(Comparable[] a, int i, int j){
Comparable t = a[i];
a[i] = a[j];
a[j] = t;
}
private static int greater(Comparable v , Comparable w){
return v.compareTo( w );
}
//greater(arr[j],arr[start]) == -1
//測試代碼
public static void main(String[] args) {
Integer[] nums = {6,1,7,4,5,2,3,9,1,7,8,2,3};
// Integer[] nums = {23,7,5,8,0,2,1,43,22,3,9,1,7,8,2,3};
DualPivotQuicksort.sort(nums,0,12);
// DualPivotQuicksort.sort(nums,0,15);
System.out.println(Arrays.toString(nums));
}
}
- 排序前
雙軸快排DualPivotQuicksort雙軸快排 - 排序後
雙軸快排DualPivotQuicksort雙軸快排