• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > C#递归算法寻找数组中第K大的数

C#递归算法寻找数组中第K大的数

作者:张玉彬 字体:[增加 减小] 来源:互联网 时间:2017-05-28

张玉彬 通过本文主要向大家介绍了c#排序算法,c#加密解密算法,c#递归算法,c#算法,c#递归算法经典实例等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

1.概述

  国人向来喜欢论资排辈的,每个人都想当老大,实在当不成,当个老二,老三,老K也不错,您一定看过这样的争论: 两个人吵架,一个人非常强势,另外一个忍受不住了便说:"你算老几呀?",下面就通过这篇文章就是要解决找出老几的问题!

2.应用场景

  在向量V[first,last)中查找出第K大元素的值

3.分析

  如果利用排序算法将向量V排好序,那么第K大元素就是索引为v.length-k的元素了,这样能解决问题,但效率不高,因为这相当于为了歼灭敌人一个小队而动用了我们全军的力量,得不偿失,回想快速排序中的分表,每次都将目标向量分为两个子表,左子表中全部小于中间元素v[mid],右边都大于中间元素v[mid],这样就可以减小了查找范围,因为我可以只查找左子表或者右子表就能找到目标元素了。如下图所示,我们可以将向量 v划分成如下

Left(<=KLargest) KLargest Right(>=KLargest)

按照这样的思路,我们仍使用快速排序中的分表策略,首先将向量V从中间位置分开,分成左和右,分好后,中间值的索引如果恰恰等于K,就找到了,否则如果中间元素索引大于K,则在左子表中继续查找,忽略右子表,如果中间值索引小于K,则在右子表中继续查找,如此循环往复。

快速排序中的子表划分函数为:

/// <summary>
/// 交换位置
/// </summary>
/// <param name="v"></param>
/// <param name="index1"></param>
/// <param name="index2"></param>
private void Swrap(int[] v, int index1, int index2)
{
  int temp = v[index1];
  v[index1] = v[index2];
  v[index2] = temp;
}
/// <summary>
/// 将向量V中索引{first,last)划分成两个左子表和右子表
/// </summary>
/// <param name="v">向量V</param>
/// <param name="first">开始位置</param>
/// <param name="last">结束位置</param>
private int PivotIndex(int[] v, int first, int last)
{
  if (last == first)
  {
    return last;
  }
  if (last - first == 1)
  {
    return first;
  }
  int mid = (first + last) / 2;
  int midVal = v[mid];
  //交换v[first]和v[mid]
  Swrap(v, first, mid);
  int scanA = first + 1;
  int scanB = last - 1;
  for (; ; )
  {

    while (scanA <= scanB && v[scanA] < midVal)
    {
      scanA++;
    }
    while (scanB > first && midVal <= v[scanB])
    {
      scanB--;
    }
    if (scanA >= scanB)
    {
      break;
    }
    Swrap(v, scanA, scanB);
    scanA++;
    scanB--;
  }
  Swrap(v, first, scanB);
  return scanB;

}

</div>

设计一个函数,FindKLargest(int[] v,int first,int last,int k);这个函数包括四个参数:向量V,开始位置first,结束位置last,和第k大中的K,则该函数为:

调用FindKLargest后,因为数组是从小到大排序,所以第K大元素的值为V[v.Length-k];

void FindKLargest(int[] v, int first, int last, int k)
{

  //表示分表中值的索引
  int index = 0;
  index = PivotIndex(v, first, last);
  if (index == k)
  {
    //找到了K大
    return;
  }

  if (index > k)
  {
    //只在左子表中查找
    FindKLargest(v, first, index, k);
  }

  else
  {
    //只在右子表中查找
    FindKLargest(v, index, last, k);
  }
}

</div>

4.运行结果:

  原向量 :v  = { 100, 200, 50, 23, 300, 560, 789, 456, 123, 258}
  first = 0; last = v.Length;k=3
  输出:456

5.结论

  利用递归算法可以将比较复杂的问题划分为越来越小的小问题,这样能够使复杂问题简单化,这样的思路在系统设计和架构中同样有着至关重要的作用,一个好的架构师,面对复杂的问题,能庖丁解牛般化腐朽为神奇,而坏的却往往适得其反,他们的特长是简单问题复杂化。

6.项目文件
http://xiazai.weikejianghu.com/201606/yuanma/FindK(weikejianghu.com).rar

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C#递归算法之打靶算法分析
  • C#算法函数:获取一个字符串中的最大长度的数字
  • C#递归算法之快速排序
  • C#递归算法寻找数组中第K大的数
  • C#用递归算法解决经典背包问题
  • C#算法设计之关于1000瓶水的问题
  • C#排序算法的比较分析
  • C#实现的优酷真实视频地址解析功能(2014新算法)
  • C#常见算法面试题小结
  • c# 快速排序算法

相关文章

  • 2017-05-28C#操作mysql数据库的代码实例
  • 2017-05-28c#判断网络连接状态
  • 2017-05-28c#字符串查找某词出现的次数及索引
  • 2017-05-28C#日历样式的下拉式计算器实例讲解
  • 2017-05-28C#正则表达式Regex类的常用匹配
  • 2017-05-28C#实现矩阵加法、取负、数乘、乘法的方法
  • 2017-05-28c# 判断指定文件是否存在的简单实现
  • 2017-05-28WinForm的延时加载控件概述
  • 2017-05-28C#根据日期计算星期几的实例代码
  • 2017-05-28C#判断程序是否是管理员权限运行的方法代码示例

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#微信公众平台开发之高级群发接口
    • c#基数排序Radix sort的实现方法
    • c# 钩子学习笔记
    • C#使用foreach语句遍历二维数组的方法
    • c#模拟银行atm机示例分享
    • C#的WEBBROWSER与JS交互小结
    • sqlserver备份还原数据库功能封装分享
    • C#抽象类和接口的区别分析
    • C#实现的图片、string相互转换类分享
    • vista和win7在windows服务中交互桌面权限问题解决方法:穿透Session 0 隔离

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有