1、寻找数组中的第二大数

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace ConsoleApplication2
{
class Program
{
static void Main(string[] args)
{
int[] ar = { , , , , , ,,,};
try
{
Console.WriteLine(get2rdMax(ar).ToString());
}
catch (Exception exc)
{
Console.WriteLine(exc.Message);
}
Console.ReadKey();
}
private static int get2rdMax(int[] ar)
{
int max = ar[], s_max = ar[];
for (int i = ; i < ar.Length; i++)
{
if (ar[i] > s_max) //后面的跟第二大先比,if大,赋值给第二大,
{
s_max = ar[i];
//第二大再跟最大比,if还大,第二大跟最大交换
if (s_max > max) //交换。一次最终:max>s_max>ar[i]
{
int temp;
temp = max;
max = s_max ;
s_max = temp ;
}
}
}
if (max == s_max) //至少有两个一样的最大值
throw new Exception("no second max!");
else
return s_max;
}
}
}

2、寻找数组中的第K大数

求一个数组中第k大的数,我第一印象是冒泡,因为只要冒泡k趟即可,第一趟冒泡第一大,第二次冒泡第二大,第k次冒泡第k大,时间复杂度为O(kn),n为数组长度。但是我们都知道快速排序是对冒泡的改进,降低冒泡的递归深度,使时间复杂度降低到O(nlgn),为什么不用快排呢?那么快排的时间复杂度又是多少呢?

因为快排每次将数组划分为两组加一个枢纽元素,每一趟划分你只需要将k与枢纽元素的下标进行比较,如果比枢纽元素下标大就从右边的子数组中找,如果比枢纽元素下标小从左边的子数组中找,如果一样则就是枢纽元素,找到,如果需要从左边或者右边的子数组中再查找的话,只需要递归一边查找即可,无需像快排一样两边都需要递归,所以复杂度必然降低。

最差情况如下:假设快排每次都平均划分,但是都不在枢纽元素上找到第k大

第一趟快排没找到,时间复杂度为O(n),第二趟也没找到,时间复杂度为O(n/2),。。。。。,第k趟找到,时间复杂度为O(n/2k),所以总的时间复杂度为

O(n(1+1/2+....+1/2k))=O(n),明显比冒泡快,虽然递归深度是一样的,但是每一趟时间复杂度降低。

快排求第k大数代码如下:(C#版)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 求数组第K大的数
{
class Program
{
static void Main(string[] args)
{
//int[] ar = { 1, 2, 3, 4, 5, 6 ,17,28,39,7,8,9,10};
//Array.Sort(ar); //此方法实现的就是快速排序。。
//Console.WriteLine("数组中第12大的数是:"+ar[12-1]);
//Console.ReadLine( ); int[] ar = { , , , , , , , , , , , , };
Console.WriteLine("表中有元素" + ar.Length + "个,下标是0—" + (ar.Length - ));
for (int i = ; i < ar.Length; i++)
{
Console.Write(ar[i] + "-");
} QuickSort(ar, , ar.Length - ); //快速排序
Console.WriteLine();
for (int i = ar.Length - ; i >= ; i--) //从大到小排
{
Console.Write(ar[i] + "-");
} Console.WriteLine("输入你想找的第K大数(正整数):");
string K = Console.ReadLine();
int k = Convert.ToInt32(K);
Console.WriteLine(ar[ar.Length - k]);
Console.ReadLine();
} public static void QuickSort(int[] a, int low, int high)
{
int i = low;
int j = high;
int tmp = a[low]; //分界点
while (low < high)
{
while ((low < high) && (a[high] >= tmp)) //后边 比tmp大的 不动
{
--high;
}
a[low] = a[high]; //将 比tmp小的放在前面,low位置 while ((low < high) && (a[low] <= tmp)) //前面 比tmp小的 不动
{
++low;
}
a[high] = a[low]; //将 比tmp大的放在后面,high位置
//直到此时 low=high
}
a[high] = a[low] = tmp; // 此时low=high ,就完成了以tmp值来分界 //分别对前后两部分来 快速排序
if (i < low - ) //对tmp 前面的数(0到low-1) 递归调用,,此时【low】==tmp,low=high
{
QuickSort(a, i, low - );
}
if (low + < j) //对tmp 后面的数(low+1到j) 递归调用,,此时【low】==tmp,low=high
{
QuickSort(a, low + , j);
}
}
}
}

寻找数组中第K大数的更多相关文章

  1. [经典算法题]寻找数组中第K大的数的方法总结

    [经典算法题]寻找数组中第K大的数的方法总结 责任编辑:admin 日期:2012-11-26   字体:[大 中 小] 打印复制链接我要评论   今天看算法分析是,看到一个这样的问题,就是在一堆数据 ...

  2. 寻找数组中第K频繁的元素

    问题是:给你一个数组,求解出现次数第K多的元素.当然leetcode上的要求是算法复杂度不能大于O(N*logN). 首先这个问题我先是在leetcode上看到,当时想了两种做法,做到一半都觉得不是很 ...

  3. 寻找数组中第K大的数

    给定一个数组A,要求找到数组A中第K大的数字.对于这个问题,解决方案有不少,此处我只给出三种: 方法1: 对数组A进行排序,然后遍历一遍就可以找到第K大的数字.该方法的时间复杂度为O(N*logN) ...

  4. 寻找数组中的第K大的元素,多种解法以及分析

    遇到了一个很简单而有意思的问题,可以看出不同的算法策略对这个问题求解的优化过程.问题:寻找数组中的第K大的元素. 最简单的想法是直接进行排序,算法复杂度是O(N*logN).这么做很明显比较低效率,因 ...

  5. 前端算法题:找出数组中第k大的数字出现多少次

    题目:给定一个一维数组,如[1,2,4,4,3,5],找出数组中第k大的数字出现多少次. 例如:第2大的数是4,出现2次,最后输出 4,2 function getNum(arr, k){ // 数组 ...

  6. 查找数组中第k大的数

    问题:  查找出一给定数组中第k大的数.例如[3,2,7,1,8,9,6,5,4],第1大的数是9,第2大的数是8-- 思考:1. 直接从大到小排序,排好序后,第k大的数就是arr[k-1]. 2. ...

  7. [LeetCode] Kth Largest Element in an Array 数组中第k大的数字

    Find the kth largest element in an unsorted array. Note that it is the kth largest element in the so ...

  8. 数组中第K小的数字(Google面试题)

    http://ac.jobdu.com/problem.php?pid=1534 题目1534:数组中第K小的数字 时间限制:2 秒 内存限制:128 兆 特殊判题:否 提交:1120 解决:208 ...

  9. #7 找出数组中第k小的数

    「HW面试题」 [题目] 给定一个整数数组,如何快速地求出该数组中第k小的数.假如数组为[4,0,1,0,2,3],那么第三小的元素是1 [题目分析] 这道题涉及整数列表排序问题,直接使用sort方法 ...

随机推荐

  1. iOS iPhone X 适配启动图片

    刚出了Xcode9正式版 迫不及待地下载 使用了 保密了这么久的iPhone X 模拟器 运行起来这个样子 上下都留白不正常 这必须匹配新的启动图才行,马上查苹果开发文档 get it!!!! 添加了 ...

  2. TIJ读书笔记03-初始化和构造器

      TIJ读书笔记03-初始化和构造器 初始化和清理是涉及安全的两个问题,如果对象不能正确的初始化会引起很多错误,比如空指针异常等,如果不能恰当及时的清理,会占用过多资源. 构造器在创建一个类的实例的 ...

  3. Ubuntu登陆不进去(已解决)【转】

    本文转载自:https://blog.csdn.net/u010925447/article/details/72236387 Ubuntu一直在登陆界面循环:登陆密码是正确的,但是登陆后自动退回登陆 ...

  4. Kubernetes Ingress

    Kubernetes关于服务的暴露主要是通过NodePort方式,通过绑定node主机的某个端口,然后进行pod的请求转发和负载均衡,但这种方式下缺陷是 Service可能有很多个,如果每个都绑定一个 ...

  5. Kubernetes pod网络解析

    在Kubernetes中,会为每一个pod分配一个IP地址,pod内的所有容器都共享这个pod的network namespace,彼此之间使用localhost通信. 那么pod内所有容器间的网络是 ...

  6. HTML5 上传图片 到ASP.NET MVC

    @{ ViewBag.Title = "Home Page"; } <!DOCTYPE HTML PUBLIC> <html> <head> & ...

  7. Linux 修改DNS解决 Could not retrieve mirrorlist" 报错

    CentOS yum有时出现“Could not retrieve mirrorlist ”的解决办法——resolv.conf的配置 或者IP配置文件上写入 缺少DNS引起的问题1. 无法识别域名 ...

  8. mac下查看占用端口的进程及杀死进程

    mac lsof -i :9000 kill -9 716

  9. c# 判断字符串中是否含有汉字,数字

    正则表达式使用时需要引用 using System.Text.RegularExpressions; private void buttonX1_Click(object sender, EventA ...

  10. linux查看cpu

    #查看物理CPU个数 cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l #查看每个物理CPU中core的个数(即核数 ...