时常在笔试,面试题中看到这个问题,《算法导论》中给出了很好的解答。

Selection of the ith smallest element of the array A can be done in θ(n) times.

The psuedocode is following:

Code
Randomized_Select(A,p,r,i)
{
    if p==r
        then return A[p]
    q=Randomized_Partition(A,p,r)
    k=q-p+1
    if i==k
        then return A[q]
    else if i<k
        then return Randomized_select(A,p,q-1,i)
    else
        return Randomized_select(A,q+1,r,i-k)
}

=====================================
Randomized_Partition(A,p,r)
{
    i=RANDOW(p,r)
    exchange A[r] ↔ A[i]
    return Partition(A,p,r)
}
=====================================
Partition(A,p,r)
{
    x=A[r]
    i=p-1
    for j=p to r-1
        if A[j]<=x
              then i=i+1
                  exchange A[i]↔A[j]
    exchange A[i+1] ↔A[r]
    return i+1
}

Transfer to C# code:

Codenamespace SelectMinimum{class Program    {static void Main(string[] args)        {int[] A = new int[] {0,25,12,14,57,45,18,75,85,74,45,63,35,28,39 };            SelectSort ss = new SelectSort();int result;            result=ss.Randomized_Select(A,0,14,11);            Console.WriteLine(result);            Console.ReadLine();        }

    }

public class SelectSort    {public int Randomized_Select(int[] A, int p, int r, int i)        {if (p == r)return A[p];int q = Randomize_Partition(A, p, r);int k = q - p + 1;if (i == k)return A[q];else if (i < k)return Randomized_Select(A, p, q - 1, i);elsereturn Randomized_Select(A, q + 1, r, i - k);

        }

public int Randomize_Partition(int[] A, int p, int r)        {            Random rd = new Random();int i = rd.Next(p, r);int temp;            temp = A[r];            A[r] = A[i];            A[i] = temp;return Partition(A, p, r);        }

public int Partition(int[] A, int p, int r)        {int x = A[r];int i = p - 1;for (int j = p; j <= r - 1; j++)            {if (A[j] <= x)                {                    i += 1;int temp;                    temp = A[i];                    A[i] = A[j];                    A[j] = temp;                }            }int temp2;            temp2 = A[i + 1];            A[i + 1] = A[r];            A[r] = temp2;return i + 1;        }    }}

转载于:https://www.cnblogs.com/ision/archive/2008/11/05/1327313.html

从N个元素中选择第i小的元素相关推荐

  1. 行内元素中的非替换行内元素和替换行内元素

    今天看<别具光芒css>发现了以前未见过的词,替换的行内元素和非替换的行内元素.            替换的行内元素具有"内在尺寸",尺寸是有自身决定的,而不会受周围 ...

  2. 分治法 第3关:找出数组中第 k 个小的元素

    任务描述 本关任务:对于给定的 n 个元素的数组a[0:n-1],要求从中找出第 k 小的元素. 编程要求 请在右侧编辑器Begin-End处补充代码,完成本关任务,注意需要学生自己获取输入数据再进行 ...

  3. 如何在jQuery的SELECT元素中选择特定选项?

    如果您知道索引,值或文本. 另外,如果您没有直接参考的ID. 这 , 这和这都是有用的答案. 标记示例 <div class="selDiv"><select c ...

  4. Python从序列中选择k个不重复元素

    昨天的文章中有个错别字,开头第一句"颜色"应为"演示",抱歉抱歉. Python操作高版本Excel文件:颜色.边框.合并单元格 集合中的元素不允许重复,Pyt ...

  5. 若在矩阵A中存在一个元素Aij,该元素是第i行元素中最大值并且又是第j列元素中最小值,则称此元素值为该元素的一个鞍点。假设以二维数组存储矩阵A,求该矩阵中的所有鞍点。

    #include <stdio.h> #include <stdlib.h> int main() {     int nh,nl,max,p,top=0;//max存储该行的 ...

  6. 【算法30】从数组中选择k组长度为m的子数组,要求其和最小

    原题链接:codeforce 267 Div2 C 问题描述: 给定长度为n的数组a[],从中选择k个长度为m的子数组,要求和最大. 形式描述为:选择$k$个子数组[$l_1$, $r_1$], [$ ...

  7. java中选择排序和冒泡排序_Java选择排序就是比冒泡排序牛「具体详情,请看此文」...

    什么是选择排序 选择排序原理即是,遍历元素找到一个最小(或最大)的元素,把它放在第一个位置,然后再在剩余元素中找到最小(或最大)的元素,把它放在第二个位置,依次下去,完成排序. 时间复杂度 选择排序的 ...

  8. php选择符和举例子,关于CSS3中选择符的实例详解

    英文原文: www.456bereastreet.com/archive/200601/css_3_selectors_explained/ 中文翻译: www.dudo.org/article.as ...

  9. 在数组中查找第k个最大元素_查找数组中每个元素的最近最大邻居

    在数组中查找第k个最大元素 Problem statement: 问题陈述: Given an array of elements, find the nearest (on the right) g ...

最新文章

  1. Windows安全软件长臂管辖的折中方案?
  2. c语言中穷竭算法,hihocoder#1054 : 滑动解锁(深度优先搜索)
  3. 一般拦截器 serviceImpl部分
  4. MapTask、ReduceTask并行度决定机制
  5. java calendar 毫秒_java Calendar(将时间精确到毫秒)
  6. 编辑距离 在输入检测中的应用
  7. Web 前端的路该怎么走?
  8. 通过IP获取相应所在地的地址
  9. html5高仿mac桌面,WinDynamicDesktop(高仿macOS动态壁纸)
  10. 我的Delphi开发经验谈(本人修改版) 收藏
  11. 初学者CAD画矩形如何定义尺寸?
  12. 如何快速抠图?图片怎样去底色变透明?
  13. gentoo linux 分区_开始使用gentoo linux——gentoo安装笔记(上)
  14. 在Mac上安装和配置Tunnelblick工具
  15. 童年的精彩(70年代~80年代初),以后的就不要看,会羡慕死你们的!^_^
  16. 4G套餐用户挺住了,运营商比你们急,会给优惠的低价流量
  17. 全国地区+邮编的数据库脚本
  18. anaconda3里pkgs可以删除吗,我试过conda clean -a,但用完之后还有10个G,吐血,C盘没空间了,pkgs删除影响虚拟环境吗,毕竟base大多数人用不到啊,求教
  19. 静态路由和动态路由详解
  20. IMS 注册流程最新

热门文章

  1. 分享memcache和memcached安装过程(转)
  2. Ubuntu 11.04 x64 下安装Python
  3. DEDECMS 5.6整合Discuz_X1.5的方法
  4. 将数组绑定到dropdownlist上
  5. jmeter聚个报告怎么看qps_【jmeter】jmeter测试网站QPS
  6. 镭波笔记本安装linux,镭波笔记本windows7旗舰版系统下载与安装教程
  7. 基于Matlab的循环码实验报告,基于MATLAB的循环码实验报告
  8. 获取后端接口请求中的参数(@PathVariable,@RequestParam,@RequestBody区别,使用postman请求
  9. 盘点9 个实用的 JSON 工具
  10. 收集一些常用的正则表达式