算法导论示例-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));
    }
}

算法探究:线性时间选择问题

一.什么是线性时间选择问题 前几天,女票问到了快速排序,然后我看了一下代码,发现不对呀,为什么连基本的递归都没有,后来仔细看了整个程序之后,发现,这个程序并不是普通的快速排序,而这也就引出了今天要讲的...

线性时间选择算法Randomized_Select

假设输入数据是互异的。Randomized_Select算法以快速排序算法为模型,可以求一个数组中第k小的元素。与快速排序不同的是,快速排序会递归处理划分的两边,而Randomized_Select只...

寻找最小的k个数(Randomized-Select方法)

/* *寻找最小的k个数 *题目描述:5.查找最小的k个元素 *题目:输入n个整数,输出其中最小的k个。 *例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。...

java查找算法(四)--随机查找(Randomized-Select)

/* * 以快排为模型,以第一个数为基准对数组进行划分,找到第一个数的正确位置 * 比较a[low]=pivot 值得位置与 k 的大小,确定继续在左右还是右边递归查找 * 平均时间复杂度为 O...
  • y999666
  • y999666
  • 2016年03月21日 14:17
  • 705

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

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

算法导论课后习题解析 第四章 上

算法导论课后习题解析 第四章 上 4.1-1 返回只包含绝对值最小的元素的子数组。   4.1-2 1 2 3 ...

<算法导论>第八章4 水壶(Kettle)

8-4  水壶    假设给定了n个红色的水壶和n个蓝色的水壶,它们的形状和尺寸都不相同。所有红色水壶中所盛水的量都不一样,蓝色水壶也是一样。此外,对于每个红色的水壶,都有一个对应的蓝色水壶,两者所...

算法导论------ShellSort希尔排序

目录 1.Shellsort的思想 2.代码实现 3.增量序列 4.算法分析 5.参考资料   Shellsort是最古老的排序算法之一,该算法以其发明者Donald L. Shell的名字命名(19...

【算法导论】动态规划之“钢管切割”问题

动态规划,其实跟分治法有些相似,基本思想都是将复杂的问题分成数个简单的子问题,然后再去解决。它们的区别在于,分治法关注的子问题不相互“重叠”,而动态规划关注的子问题,多是相互“重叠”的。...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:算法导论示例-RandomizedSelect
举报原因:
原因补充:

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