Robert W. Floyd

Floyd-Rivest 算法是一种选择算法,用于在不同元素的数组中找到第k个最小元素。它类似于快速选择算法,但在实际运行中有更好的运行时间。 和 QuickSelect 一样,该算法基于分区的思想工作。对数组进行分区后,分区元素会在正确的排序位置结束。如果数组有所有不同的元素,检索第(k+1) 个个最小元素与排序后检索第(k+1) 个个元素相同。因为完全排序是昂贵的(需要 O(N log N) 来计算),所以 Floyd-Rivest 算法利用分区在 O(N) 时间内完成相同的工作。

算法流程:

  1. 如果所考虑的数组 S 的大小足够小,则直接应用快速选择算法来获得第 K 个最小元素。这个大小是算法的任意常数,作者选择它作为 600 。
  2. 否则,使用随机抽样选择 2 个枢轴- newLeftIndex 和 newRightIndex,使得它们具有包含第 K 个最大元素的最高概率。然后,递归调用该函数,数组的左右边界现在设置为 newLeftIndex 和 newRightIndex。
  3. 像快速选择一样,在划分子阵列后,需要设置左右边界,使它们包含 K 最大的元素。 围绕 K 分割数组后,第 K 个元素处于其正确的排序位置。因此,左右边界以这样一种方式设置,即所考虑的子阵列包含数组[k]。

源程序

using System;
using System.Collections;
using System.Collections.Generic;namespace Legalsoft.Truffer.Algorithm
{/// <summary>/// 弗洛伊德-瑞文斯特算法/// Floyd Rivest Algorithm/// </summary>public static partial class Algorithm_Gallery{private static int Sign(double x){return (x < 0) ? -1 : (x > 0) ? 1 : 0;}private static void Swap(ref int[] arr, int i, int j){int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}private static int Floyd_Rivest(int[] arr, int left, int right, int k){int i;while (right > left){if ((right - left) > 600){int n = right - left + 1;i = k - left + 1;double z = Math.Log(n);double s = 0.5 * Math.Exp(2 * z / 3);double sd = 0.5 * Math.Sqrt(z * s * (n - s) / n) * Sign(i - n / 2);int newLeft = Math.Max(left, (int)(k - i * s / n + sd));int newRight = Math.Min(right, (int)(k + (n - i) * s / n + sd));Floyd_Rivest(arr, newLeft, newRight, k);}int t = arr[k];i = left;int j = right;Swap(ref arr, left, k);if (arr[right] > t){Swap(ref arr, left, right);}while (i < j){Swap(ref arr, i, j);i++;j--;while (arr[i] < t){i++;}while (arr[j] > t){j--;}}if (arr[left] == t){Swap(ref arr, left, j);}else{j++;Swap(ref arr, right, j);}if (j <= k){left = j + 1;}if (k <= j){right = j - 1;}}return arr[k];}}
}

POWER BY 315SOFT.COM

C#,弗洛伊德-瑞文斯特(Floyd-Rivest)算法与源代码相关推荐

  1. 微信瑞文智力测试1分_答完瑞文智力测试的题之后,怎样看智商是多少?

    展开全部 一.瑞文标准推理测验共分为A.B.C.D.E五组,共60题,每题答对得1分,答错不得分,有两种62616964757a686964616fe4b893e5b19e31333431363038 ...

  2. 如何用Python面向对象实现盖伦和瑞文互殴?

    首先我们来定义一个英雄类 #定义英雄类,等一下提供盖伦和瑞文继承 class Hero:#__init__为初始化方法,在对象实例化的时候自动调用def __init__(self,nickname, ...

  3. 【算法】弗洛伊德(Floyd)算法

    这个算法主要要弄懂三个循环的顺序关系. 弗洛伊德(Floyd)算法过程: 1.用D[v][w]记录每一对顶点的最短距离. 2.依次扫描每一个点,并以其为基点再遍历所有每一对顶点D[][]的值,看看是否 ...

  4. 瑞文标准推理测试软件,瑞文标准推理测验标准答案表

    <瑞文标准推理测验标准答案表>由会员分享,可在线阅读,更多相关<瑞文标准推理测验标准答案表(2页珍藏版)>请在人人文库网上搜索. 1.瑞文标准推理测验的说明本测验有5组,每组1 ...

  5. 英雄联盟手游锐雯有多么强大,新手教程全给你,瑞文很简单

    习惯玩英雄联盟手游的时候是否会注意一个问题,那就是自己能够玩哪些英雄,这都是很重要的事情,只是所有的玩家都遇到过这样的问题吗?英雄联盟手游与端游其实有很大的出入,只是这样的出路需要玩家去适应,毕竟手机 ...

  6. 七、最短路径——弗洛伊德(Floyd)算法

    为了能讲明白弗洛伊德(Floyd)算法的精妙所在,我们先来看最简单的案例.下图是一个最简单的3个顶点连通网图. 我们先定义两个二维数组D[3][3]和P[3][3],D代表顶点到顶点的最短路径权值和的 ...

  7. 【数据结构】图—弗洛伊德(Floyd)算法

    前言 上文介绍了迪杰斯特拉(Dijkstra)算法,计算网图的某个源点到其余各个顶点的最短路径问题(边权值为非负值),本文介绍另一个求最短路径的算法--弗洛伊德算法,它是计算所有顶点到所有顶点的最短路 ...

  8. 弗洛伊德(Floyd)算法之两点之间的最短距离问题

    1.概述 (1)与迪杰斯特拉(Dijkstra)算法一样,弗洛伊德(Floyd)算法也是一种用于寻找给定的加权图中顶点间最短路径的算法,该算法 名称以创始人之一.1978 年图灵奖获得者.斯坦福大学计 ...

  9. 杰文斯效应(Jevons effect)

    杰文斯效应(Jevons effect),技术的进步会增加对技术的消费量,只要到了一定的规模,盈利是迟早的事情. 杰文斯很早就在他的学说中对经济学和逻辑学展现他特有的开创性作用.效用理论是他的< ...

最新文章

  1. ajax传值从前台到后台乱码,jquery ajax传值,get方式后台中文乱码
  2. python电脑配置要求-1.安装python3.5及电脑环境变量的配置
  3. .Net软件UI界面测试自动化--UIAutomation技术
  4. yaml for java_细数Java项目中用过的配置文件(YAML篇)
  5. jaxb注解使用_使用JAXB的简介
  6. python 是否可以一键修图_ps如何快速批量修图?
  7. SPSS操作(五):主成分分析
  8. python实现随机抽奖游戏
  9. 夜神模拟器连接手柄无反应_夜神模拟器手柄设置
  10. JAVA 计算小数位数
  11. J.A.R.V.I.S.
  12. git push 时出现错误error: failed to push some refs to ‘https://gitee.com/**.git‘
  13. Arduino追光小车
  14. mysql innodb文件存储_MySQL数据库和InnoDB存储引擎文件
  15. git常用命令和基本操作
  16. 单用户计算机安全不包括什么,电子科技大20秋《计算机网络安全》在线作业1参考...
  17. 使用php制作导航栏,如何制作简单导航栏
  18. 企业logo添加到word的模板制作
  19. 视觉SLAM笔记(33) 对极约束求解相机运动
  20. 2022年第三届MathorCup高校数学建模挑战赛——大数据竞赛

热门文章

  1. 功能测试、健壮性测试
  2. Python 字符串、列表及字典的相互转换
  3. 硬件篇:手把手教你制作属于你的遥控车(51单片机蓝牙小车)
  4. 在廖雪峰官网学习 python 高阶函数
  5. 安卓9.0官方系统升级包_努比亚 Z17系统内测更新 红魔放出安卓9.0 P升级包
  6. linux shellshock漏洞,shellshock漏洞分析
  7. HTML5 和 CSS3 的新特性--品优购首页制作
  8. 3.4亿用户,看不起百亿估值的快看漫画
  9. 老生常谈的 Redis 雪崩、击穿、穿透、预热、降级一次全安排
  10. 链表14:单链表的排序