Expm 2_2 查找中项问题

对于长度为n的整型数组A,随机生成其数组元素值,然后实现一个线性时间的算法,在该数组中查找其中项。

 1 package org.xiu68.exp.exp3;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 import java.util.Random;
 6 
 7 public class Exp3_1 {
 8 
 9     //对于长度为n的整型数组A,随机生成其数组元素值,然后实现一个线性时间的算法,在该数组中查找其中项
10     public static void main(String[] args) {
11         // TODO Auto-generated method stub
12         ArrayList<Integer> array=new ArrayList<>();
13         for(int j=0;j<10;j++){
14             array.clear();
15             for(int i=0;i<10;i++){
16                 int k=new Random().nextInt(100);
17                 array.add(k);
18                 System.out.print(k+"  ");
19             }
20             System.out.println();
21             System.out.println("中位数为"+findMedian(array,array.size()/2));
22         }
23     }
24     
25     //获取中位数
26     public static int findMedian(List<Integer> array,int k){
27         
28         int v=array.get(0);
29         ArrayList<Integer> leftList=new ArrayList<>();        //比v小的集合
30         ArrayList<Integer> equalList=new ArrayList<>();        //与v相等的集合
31         ArrayList<Integer> rightList=new ArrayList<>();        //比v大的集合
32         
33         for(int i=0;i<array.size();i++){
34             int value=array.get(i);
35             if(value>v){
36                 rightList.add(value);
37             }else if(value<v){
38                 leftList.add(value);
39             }else{
40                 equalList.add(value);
41             }
42         }
43         //findMedian(S,k)=findMedian(SL,k)  如果k<=|SL|
44         if(k<=leftList.size())
45             return findMedian(leftList,k);
46         //findMedian(S,k)=v  如果|SL|<k<=|SL|+|SV|
47         else if(k>leftList.size() && k<=leftList.size()+equalList.size())
48             return equalList.get(0);
49         //findMedian(S,k)=findMedian(SR,k-|SL|-|SV|)  如果k>|SL|+|SV|
50         else
51             return findMedian(rightList,k-leftList.size()-equalList.size());
52     }
53 
54 }
View Code
原文地址:https://www.cnblogs.com/xiu68/p/7988630.html