用快排来查找第k小元素

来源:互联网 发布:淘宝女装长袖连衣裙 编辑:程序博客网 时间:2024/06/05 15:10
 
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小元素的问题。快排我熟,那是相当的熟,暑假的时候快排我是研究了好长时间了,枢轴不管怎么找我都尝试过了,不管是原理还是实现都烂熟于心,只是,经常忘了还有这么好的一个算法。现在把这个问题拿出来,突然觉得也没有原来看的那么复杂啊,只要是用心想肯定可以解决的。突然发现了,好多事情并不难,只是因为在开始干之前就已经把自己给打败了。在我找到心仪的工作之前,还会继续来研究这所谓的数据结构与算法,挺有意思的!
原创粉丝点击