思路:利用快速排序中的分区算法来解决
分区算法(将小的数值挪到左侧,大的数挪到右侧)
采用递归的方法进行查找。
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr= {3,1,5,7,8,2};
Scanner scan=new Scanner(System.in);
int n=scan.nextInt();
int m=seck(arr,0,arr.length-1,n);
System.out.println(m);
}
public static int seck(int[] arr,int p,int r,int k)
{
int q=partition(arr,p,r);
int qk=q-p+1;//主元是第几个元素
if(qk==k)
return arr[q];
if(qk<k)
{
return seck(arr,p,q-1,k);
}
else {
return seck(arr,q+1,r,k-qk);//因为k表示的是数组中的第几个元素,随着数组的变化而变化
}
}
public static int partition(int[] arr, int p, int r) {
//优化,在p, r, mid之间,选一个中间值作为主元
int midIndex = p + ((r - p) >> 1);//中间下标
int midValueIndex = -1;//中值的下标
if(arr[p] <= arr[midIndex] && arr[p] >= arr[r]) {
midValueIndex = p;
}else if(arr[r] <= arr[midIndex] && arr[r] >= arr[p]) {
midValueIndex = r;
}else {
midValueIndex = midIndex;
}
swap(arr, p, midValueIndex);
int pivot = arr[p];
int left = p + 1; //左侧指针
int right = r; //右侧指针
while(left <= right) {
while(left <= right && arr[left] <= pivot) {
left++;
}
while(left <= right && arr[right] > pivot) {
right--;
}
if(left < right) {
swap(arr, left, right);
}
}
swap(arr, p, right);
return right;
}
private static void swap(int[] A, int p, int bigger) {
int temp = A[p];
A[p] = A[bigger];
A[bigger] = temp;
}
2.上述问题需要一定的算法设计思想,且需要对于递归和二分查找和排序有较深的理解。
一般情况下,如果不要求效率的话,可以使用普通的方法,即采用冒泡排序或者希尔排序的方法。
排序完成后,再进行查找。
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr= {3,2,1,5,7,9,4};
Scanner scan=new Scanner(System.in);
int k=scan.nextInt();
f(arr);
for(int i=0;i<arr.length;i++)
{
if(i+1==k)
{
System.out.println(arr[i]);
break;
}
}
}
public static void f(int[] arr)
{
int temp;
for(int i=0;i<arr.length;i++)
{
for(int j=i;j<arr.length;j++)
{
if(arr[i]>arr[j])
{
temp=arr[j];
arr[j]=arr[i];
arr[i]=temp;
}
}
}
}