算法导论之随机选择
2014-03-07 17:58
190 查看
package select; import java.util.Random; public class Randomized_Select { int Partition(int a[],int p,int r){//就是快速排序里面的 int x=a[r];//把每次数组A的最后一个元素作为主元 int i=p-1;//开始的时候将i 移动到数组的外面 for(int j=p;j<=r-1;j++){ if(a[j]<=x){//把 i++; swap(a, i,j);//p--i是小于等于x的,i+1--j-1是大于等于x的,j--r是还未处理的要交换下 } } swap(a, i+1, r);//把主元放在中间好区分两边的 return i+1;//返回主元的位置 } void swap( int [] A, int firstIndex, int secondIndex){ int temp = A[firstIndex]; A[firstIndex] = A[secondIndex]; A[secondIndex] = temp; } public int Randomized_Partition(int[] a,int p,int r){ Random ran=new Random(); int j=ran.nextInt(r-p)+p;//nextINT(n)返回的是0到n之间的整数 swap(a, j, r); return Partition(a,p,r); } public int RandomizedSelect(int[] a,int p,int r,int i){ if(p==r) return a[p]; int q=Randomized_Partition(a,p,r);//分成两部分A[p---q-1]和A【q----r】 int k=q-p+1;//A[p--q-1]和主元A【q】的元素个数 if(i==k) return a[q]; if(i<k) return RandomizedSelect(a,p,q-1,i);//i<k左边找 else return RandomizedSelect(a,q+1,r,i-k);//i>k右边找 } public static void main(String[] args) { Randomized_Select rs=new Randomized_Select(); int a[]={2,8,7,1,3,5,6,12,5,67,4}; System.out.println("第"+3+"小的数是"+rs.RandomizedSelect(a,0,a.length-1,3)); for(int i=0;i<a.length;i++){ System.out.print(a[i]+" "); }//这说明了我们没有先排序在取值 } }
相关文章推荐
- opengl shader 基础
- 面试题之交通管理系统
- 第一课、accdb格式和mdb格式的转换
- [转]Wireshark基本介绍和学习TCP三次握手
- 【已解决】android.view.WindowManager$BadTokenException: Unable to add window
- Visio连接数据表实体外键[快捷记录]
- k-折交叉验证(k-fold crossValidation)
- python Queue模块
- C# 系统应用之无标题窗体移动的两种方法
- Oracle ORION IO 测试工具
- 2014移动互联网入口之争剧变
- 手游开发笔记:技能编辑器(一)
- uuid和guid
- 韩国学者推概念智能眼镜 可彻底代替智能手机
- 设计模式学习(四):集中式工厂的实现—简单工厂模式
- 2.3: XML声明
- android开发——获取手机SD卡的容量
- oracle之认证
- CheckBox AllChecked
- 黑马程序员-第五届蓝桥杯校内选拔试题和 答案