zoukankan      html  css  js  c++  java
  • 第九章 中位数和顺序统计量 9.2 期望为线性时间的选择算法

    package chap09_Medians_and_Order_Statistics;
    
    import static org.junit.Assert.*;
    
    import java.util.Random;
    
    import org.junit.Test;
    
    public class SearchAlorithms {
        /**
         * 分割(快速排序中对数组的分割)
         * 
         * @param n
         * @param start
         * @param end
         * @return
         */
        protected static int partition(int[] n, int start, int end) {
            int p = end - 1;
            int s = start;// s位于大于a[p]和小于a[p]之间的位置
            int tmp;
            for (int i = start; i < end; i++) {
                if (n[i] < n[p]) {
                    tmp = n[i];
                    n[i] = n[s];
                    n[s] = tmp;
                    s++;
                }
            }
            {
                tmp = n[s];
                n[s] = n[p];
                n[p] = tmp;
            }
            return s;
        }
    
        /**
         * 随机分割,将一个数组从随机选择的位置处分割,左边小,右边大
         * 
         * @param n
         * @param start
         * @param end
         * @return
         */
        static protected int randomPartition(int[] n, int start, int end) {
            Random rand = new Random(23);
            int t = rand.nextInt(end - start) + start;
            int tmp;
            {
                tmp = n[t];
                n[t] = n[end - 1];
                n[end - 1] = tmp;
            }
            return partition(n, start, end);
        }
    
        /**
         * 搜索数组n中从start到end之间第k小的数字
         * 
         * @param n
         * @param start
         * @param end
         * @param k
         * @return
         */
        static int randomSearch(int[] n, int start, int end, int k) {
            if (start == end - 1)
                return n[start];
            int q = randomPartition(n, start, end);
            int p = q - start + 1;
            if (k == p)
                return n[q+1];
            else if (k > p)
                return randomSearch(n, q, end, k - q);
            else
                return randomSearch(n, start, q, k);
        }
    
        @Test
        public void testName() throws Exception {
            int[] n = { 13, 19, 9, 5, 12, 8, 7, 4, 21, 2, 6, 11 };
            int a = randomSearch(n, 0, 12, 1);
            System.out.println(a);
        }
    
    }
  • 相关阅读:
    【2020-05-03】发掘自己内心那个原点的力量
    【2020-05-02】要适应不确定性
    【2020-05-01】人生十三信条
    【一句日历】2020年5月
    【2020-04-30】每一句话,都是自我学习
    【2020-04-29】勤奋是一种享受
    【2020-04-28】自我观念强化的实践
    【2020-04-27】自我提升的里程碑
    【2020-04-26】还在温室里的自己
    家谱树(信息学奥赛一本通 1351)
  • 原文地址:https://www.cnblogs.com/xiaojintao/p/3781986.html
Copyright © 2011-2022 走看看