JAVAクイックソート
15236 ワード
クイックソート思想:配列の最後の要素を基準とし、最後の要素の左側からrightとし、調整が必要な区間の最初の要素をleftとする.調整アルゴリズム:leftから基準値より大きい最初の下付き文字を右に探し始め、rightから基準値より小さい最初の下付き文字を左に探します.leftとrightが出会っていなければ、leftとrightの位置の要素を交換し、leftとrightが出会うまで、基準値と出会った位置の値を交換します.出会ったときの下付き文字を返します.再帰は、返される位置の下付きの左と右から、配列全体を再帰的に調整します.再帰コード:
非再帰コード:
public void quickSort(int[] arr){
Help(arr,0,arr.length-1);
}
public void Help(int[] arr,int left,int right){
if(left>=right){
return;
}
int index = patition(arr,left,right);
Help(arr,left,index-1);
Help(arr,index+1,right);
}
public Integer patition(int[] arr,int left,int right){
int tmp = right;
while(left<right){
while(left<right && arr[right]>arr[tmp]){
right--;
}
while(left<right && arr[left]<arr[tmp]){
left++;
}
int t =arr[left];
arr[left]=arr[right];
arr[right]=t;
}
if(left>=right) {
int t = arr[left];
arr[left] = arr[tmp];
arr[tmp] = t;
}
return left;
}
非再帰コード:
public void QuickSortLoop(int[] arr){
Stack<Integer> stack = new Stack<>();
stack.push(arr.length-1);
stack.push(0);
while(!stack.isEmpty()){
int left =stack.pop();
int right= stack.pop();
if(left>=right){
continue;
}
int index = patition(arr,left,right);
stack.push(index-1);
stack.push(0);
stack.push(right);
stack.push(index+1);
}
}
public Integer patition(int[] arr,int left,int right){
int tmp = right;
while(left<right){
while(left<right && arr[right]>arr[tmp]){
right--;
}
while(left<right && arr[left]<arr[tmp]){
left++;
}
int t =arr[left];
arr[left]=arr[right];
arr[right]=t;
}
if(left>=right) {
int t = arr[left];
arr[left] = arr[tmp];
arr[tmp] = t;
}
return left;
}