算法导论示例-RandomizedSelect

原创 2006年06月06日 19:59:00
/**
 * Introduction to Algorithms, Second Edition 
 * 9.2 RANDOMIZED-SELECT
 * @author 土豆爸爸
 * 
 */
public class RandomizedSelect {
    /**
     * 选择数组从p到r之间,第i个最小值。
     * @param array 数组
     * @param p 起始索引
     * @param r 结束索引
     * @param i 最小值索引
     * @return 从p到r之间,第i个最小值
     */
    public static int select(int[] array, int p, int r, int i) {
        if(p == r) {
            return array[p];
        }
        
        int q = RandomizedQuickSort.randomizedPartition(array, p, r);
        int k = q - p + 1;
        if(k == i)  {//支点是答案
            return array[q];
        } else if(i < k) { //从前半部分找
            return select(array, p, q-1, i);
        } else { //从后半部分找,且位置为i-k
            return select(array, q+1, r, i-k);
        }
    }
}

import junit.framework.TestCase;

public class RandomizedSelectTest extends TestCase {
    public void testFixArray() {
        int[] array = { 5, 2, 4, 6, 1, 3 };
        assertEquals(1, RandomizedSelect.select(array, 0, array.length - 1, 1));
        assertEquals(3, RandomizedSelect.select(array, 0, array.length - 1, 3));
    }

    public void testRandomArray() {
        int size = (int)(Math.random()* 1000) + 4;
        int[] array = new int[size];
        for(int i = 0; i < size; i++) {
            array[i] =  (int)(Math.random()* 10000);
        }
        
        int[] clone = array.clone();
        RandomizedQuickSort.sort(clone, 0, array.length - 1);
        assertEquals(clone[0], RandomizedSelect.select(array, 0, array.length - 1, 1));
        assertEquals(clone[size - 1], RandomizedSelect.select(array, 0, array.length - 1, size));
        int random = (int)(Math.random()* size);
        assertEquals(clone[random], RandomizedSelect.select(array, 0, array.length - 1, random + 1));
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

链式哈希表(Hash Table)--算法导论示例

In computer science, a hash table is an associative array data structure that associates keys with v...

算法导论复习(2) 归并排序

归并排序时间复杂度 平均: θ(nlgn) 最好: O (nlgn) 最坏:O(nlgn) 空间复杂度:O(1) 课本在讲归并排序之前...

算法导论二:快速排序

快速排序采用的是分治策略,其方法是将一个数组a[p,r]划分为两个子数组a[p,q-1],a[q+1,r],使其左子数组元素中的元素均小于等于a[q],右子数组元素均大于a[q],并递归划分两个子数组...

钢条切割--动态规划--算法导论

在网上看到很多钢条切割的代码,很多都是C++,用到结构体,内联函数,const变量,复杂......直接写了一段java简单的代码 import java.util.Scanner; public...

算法导论 红黑树 热身 二叉树学习(一)

学习算法 还是建议看看算法导论 算法导论第三版 如果不看数学推导 仅看伪代码 难度还是适中 本系列只是记录我的学习心得 和伪代码转化代码的过程 深入学习 还是建议大家看看算法书籍 教程更加系统。...

《算法导论》学习心得(六)—— 计数排序(Java)

计数排序是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比...

算法导论-红黑树C++实现

红黑树的定义: 一棵二叉查找树如果满足下面的红黑性质,则为一棵红黑树: 1)每个节点或是红的,或是黑的。 2)根节点是黑的。 3)每个叶节点(NIL)是黑节点。 4)如果一个节点是红的,则它...

算法导论 Algorithms 01 - 线性回归 Simple linear regression

/* 假设工资是6000、那麽经过迴歸分析计算、预期花红是2386.055908。 */ #import @interface cLmCalculator : NSObject { NS...

【算法导论】求最大子数组

要求:找到数组中连续和最大的子数组 来源:算法导论,第四章 方法:分治法 思路:一个串中和最大的子数组,可能出现的位置1、前一半(不包含中间元素)             ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)