• 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
  • 相关阅读:
    C++ 根据对象名字创建对象
    Google是如何测试的(一)
    lex yacc 学习
    C语言宏定义时#(井号)和##(双井号)的用法
    更多编译器对C++11的支持比较
    用C++11替代Boost的实验之三
    最先进的开源游戏引擎KlayGE 4.2发布
    各编译器对C++11的支持比较
    在Android模拟器上的一些小陷阱
    推出KlayGE Foundation Library
  • 原文地址:https://www.cnblogs.com/xiu68/p/7988630.html
Copyright © 2020-2023  润新知