java递归分治算法

来源:互联网 发布:加湿器 超声波 知乎 编辑:程序博客网 时间:2024/05/21 09:33
java递归分治算法线性选择
/** 
  1.  * 递归分治算法之线性选择 
  2.  */  
  3. package 递归分治;  
  4. /* 
  5.  * 线性选择算法 
  6.  * 给定线性序集中n个元素和一个整数k,1≤k≤n,要求找出这n个元素中第k小的元素 
  7.  * 在最坏情况下,算法randomizedSelect需要O(n2)计算时间, 
  8.  * 可以证明,算法randomizedSelect可以在O(n)平均时间内找出n个输入元素中的第k小元素。 
  9.  */  
  10. import java.util.Random;  
  11. public class randomizedSelectTest {  
  12.       
  13.         private static int randomizedPartition(int[] a,int p,int r){  
  14.             int i=random(p,r);  
  15.             swap(a,i,p);//交换枢纽元素到区间左端   
  16.             return partition(a,p,r);      
  17.         }  
  18.           
  19.         /** 
  20.          * 线性选择指定数组中第k小的元素 
  21.          * @param a 指定数组 
  22.          * @param p 区间左端 
  23.          * @param r 区间右端 
  24.          * @param k 数组的大小位置 
  25.          * @return 返回指定数组中第k小的元素 
  26.          */  
  27.         @SuppressWarnings("unused")  
  28.         private static int randomizedSelect(int[] a,int p,int r,int k){  
  29.             if(p==r)return a[p];  
  30.             int i=randomizedPartition(a,p,r);  
  31.             int j=i-p+1;//左端元素个数  
  32.             //第k小的元素在左端   
  33.             if(k<=j)return randomizedSelect(a,p,i,k);  
  34.             else//第k小的元素在右端,并且左端已经有j个比它小的元素  
  35.                 //所以只要找右端中的第k-j小的元素就可以   
  36.                 return randomizedSelect(a,i+1,r,k-j);  
  37.         }  
  38.           
  39.         private static int random(int i,int j){  
  40.             Random r=new Random();  
  41.             return r.nextInt(j-i)+i;      
  42.         }  
  43.           
  44.         private static int partition(int[] a,int p,int r){  
  45.             int i=p,j=r+1;  
  46.             int x=a[p];  
  47.             while(true){  
  48.                 while(a[++i]<x&&i<r);  
  49.                 while(a[--j]>x);  
  50.                 if(i>=j)break;  
  51.                 swap(a,i,j);  
  52.             }  
  53.             a[p]=a[j];  
  54.             a[j]=x;  
  55.             return j;     
  56.         }  
  57.           
  58.         private static void swap(int[] a,int i,int j){  
  59.             int temp=a[i];  
  60.             a[i]=a[j];  
  61.             a[j]=temp;    
  62.         }  
  63.         public static void main(String[] args){  
  64.         }  
  65.     }  
  66. 详细可看http://www.digku.com/a/s_programming/java/2012/1128/276.html

http://www.cnblogs.com/blfwenwu/

原创粉丝点击