import java.util.Scanner;
public class Searchk {
/**
* @param args
*/
private int arrays[];
public Searchk(int []array)
{
this.arrays=array;
}
public static void main(String[] args) {
System.out.println("input the number of the int array");
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int array[]=new int[n];
for(int i=0;i<n;i++)
array[i]=sc.nextInt();
System.out.println("which one doyou like to lookfor?");
int k=sc.nextInt();
Searchk s=new Searchk(array);
s.getk(0, array.length-1, k-1);
}
//用快排查找枢轴
public int partion(int low,int high)
{
int mid=(low+high)/2;
int pivot=arrays[mid];
arrays[mid]=arrays[low];
while(low<high)
{
while(low < high && arrays[high]>=pivot)
high--;
arrays[low]=arrays[high];
while(low<high && arrays[low]<=pivot)
low++;
arrays[high]=arrays[low];
}
arrays[low]=pivot;
return low;
}
//查找元素
public void getk(int low,int high,int k)
{
if(low<high)
{
int pa=partion(low,high);
if(pa==k)
System.out.println(arrays[pa]);
else if(pa>k-1)
getk(low,pa-1,k);
else
getk(pa+1,high,k);
}
}
}
查找第k小元素是一个老生常谈的问题,以前学习算法的时候也学过,只可惜没有听明白,要不然不会没有去实现的冲动啊!前几天看了一本关于java集合的书,讲到了可以利用快排的思路来解决查找第k小元素的问题。快排我熟,那是相当的熟,暑假的时候快排我是研究了好长时间了,枢轴不管怎么找我都尝试过了,不管是原理还是实现都烂熟于心,只是,经常忘了还有这么好的一个算法。现在把这个问题拿出来,突然觉得也没有原来看的那么复杂啊,只要是用心想肯定可以解决的。突然发现了,好多事情并不难,只是因为在开始干之前就已经把自己给打败了。在我找到心仪的工作之前,还会继续来研究这所谓的数据结构与算法,挺有意思的!用快排来查找第k小元素
最新推荐文章于 2021-09-06 22:04:37 发布