1、快排递归解法:
import java.util.*;
public class Finder {
public int findKth(int[] a, int n, int K) {
// write code here
//快排思路
//找一个基数,大于基数的放左边,小于基数的放另右边
//看基数的位置,如果基数的索引位置大于k说明k位于左边区间,否则位于右边区间
//二分递归,直到 基数的位置等于k-1
return quickSort(a,0,n-1,K-1);
}
public int quickSort(int[] arr,int begin,int end,int k){
//中轴线取左侧第一个元素
int b = begin;
int e = end;
int pivot = arr[begin];
while(begin<end){
//找右边大于中轴线的元素
while(begin<end&&arr[end]<=pivot){
end--;
}
//右侧移到中轴线的左侧
arr[begin] = arr[end];
//找左侧小于中轴线的元素
while(begin<end&&arr[begin]>=pivot){
begin++;
}
//左侧移到中轴线的右侧
arr[end] = arr[begin];
}
arr[begin] = pivot;
if(begin==k){
return arr[begin];
}else if(begin>k){
//k在左侧区间
return quickSort(arr,b,begin-1,k);
}else{
//k 在右侧区间
return quickSort(arr,begin+1,e,k);
}
}
}2、快排非递归解法:
import java.util.*;
public class Finder {
public int findKth(int[] a, int n, int K) {
// write code here
//快排思路 非递归解法
//找一个基数,大于基数的放左边,小于基数的放另右边
//看基数的位置,如果基数的索引位置大于k说明k位于左边区间,否则位于右边区间
//重置begin和end的位置,继续循环,直到 中轴线位置 pivot==k-1
return quickSort(a,0,n-1,K-1);
}
public int quickSort(int[] arr,int begin,int end,int k){
//中轴线取左侧第一个元素
while(true){
int b = begin;
int e = end;
int pivot = arr[begin];
while(begin<end){
//找右边大于中轴线的元素
while(begin<end&&arr[end]<=pivot){
end--;
}
//右侧移到中轴线的左侧
arr[begin] = arr[end];
//找左侧小于中轴线的元素
while(begin<end&&arr[begin]>=pivot){
begin++;
}
//左侧移到中轴线的右侧
arr[end] = arr[begin];
}
arr[begin] = pivot;
if(begin==k){
break;
}else if(begin>k){
//k在左侧区间
end = begin-1;
begin = b;
continue;
}else{
//k 在右侧区间
begin = begin+1;
end = e;
continue;
}
}
return arr[begin];
}
}
京公网安备 11010502036488号