クイックソート
- ピボット要素は、ベンチマークを取ります
- 左を置くためにピボットより小さな要素は、ピボットより大きな右の要素を入れて
- ソートが完了するまで同じ操作の左右セクションを生成する第2ステップ
リカーシブ
再帰的に理解しやすい、主なアイデアは、ソートは再帰を素早くソート完了するまで約2のサブ間隔で継続することです。
public int[] quickSort(int[]arr){
quickSort(arr,0, arr.length-1);
return arr;
}
private int[] quickSort(int[]arr, int left, int right){
if(left<right){
int q = media(arr, left, right);
quickSort(arr, left, q - 1);
quickSort(arr, q + 1, right);
}
return arr;
}
private int media(int[]arr, int left, int right){
int tmp = arr[right];
int i = left;
for(int j=left;j<right;j++){
if(arr[j]<tmp){
int x = arr[j];
arr[j] = arr[i];
arr[i] = x;
i++;
}
}
int x = arr[right];
arr[right] = arr[i];
arr[i] = x;
return i;
}
非再帰
およそ人為的に非再帰の言葉の部分区間を保存する必要があります。再帰は常にプッシュプロセススタックされているので、再帰的な手順は、まず第一に、我々はスタックを使用して考えることができ、非再帰的なプログラムに変更されました。
public int[] quickSort(int[]arr){
Stack<Integer> stack = new Stack<>();
int left = 0, right = arr.length - 1;
stack.push(left);
stack.push(right);
while (!stack.isEmpty()){
right = stack.pop();
left = stack.pop();
int tmp = arr[right];
int i = left;
for(int j=left;j<right;j++){
if(arr[j]<tmp){
int x = arr[j];
arr[j] = arr[i];
arr[i] = x;
i++;
}
}
int x = arr[right];
arr[right] = arr[i];
arr[i] = x;
if(i-1>left) {
stack.push(left);
stack.push(i - 1);
}
if(i+1<right) {
stack.push(i + 1);
stack.push(right);
}
}
return arr;
}