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. dom树改变监听

    function unwrap(el, target) { if ( !target ) { target = el.parentNode; } while (el.firstChild) { tar ...

  2. PAT 天梯赛 L2-021. 点赞狂魔 【水】

    题目链接 https://www.patest.cn/contests/gplt/L2-021 题意 给出一个若干个人名,后面给出点赞的总数,以及每个赞的标签类型,输出前三个点赞狂魔,按标签类型不同数 ...

  3. SVN 过滤文件

    SVN新手最容易犯的一个错误: 就是把所有文件一股脑地全提交上去了. 这样很不好,因为这当中包含很多编译器自动生成的文件,还有中间文件. 这些文件可能每次编译都会不同,所以编译一次就冲突一次. 很显然 ...

  4. 【鸟哥的Linux私房菜】笔记

    操作系统核心的功能! 驱动程序与操作系统的关系 2. [计算机组成之组件] 3.CPU实际要处理的数据完全来自于主存储器,这是一个很重要的概念! 4.CPU是整个计算机系统最重要的部分,那么目前世界上 ...

  5. [SCOI2005]超级格雷码

    题目 BZOJ 洛谷 做法 爆搜真有意思 满足不重复且异或后仅一位为\(1\) 利用奇偶性交叉搜索(仅改变一位) My complete code #include<bits/stdc++.h& ...

  6. 继承Thread类与实现Runnable接口

    java中创建线程有两种方式: 1. 类继承Thread类,重写run方法,每创建一个实例对象即开启一个线程 2. 类实现Runnable接口,重写run方法,将实例对象传入新建Thread的方法: ...

  7. PostgresSQL数据库安装及操作

    PostgreSQL介绍 PostgreSQL是一个功能强大的开源对象关系数据库管理系统(ORDBMS). 用于安全地存储数据; 支持最佳做法,并允许在处理请求时检索它们. PostgreSQL(也称 ...

  8. Ubuntu下用crontab 部署定时任务

    用php做了一个网站,其中一个统计工能,需要每周定时用行.想看看有什么方法,之前看别人的东西,一般有2中方式,一个是php自带的定时任务,一个是用系统 带的,linux下的crontab和window ...

  9. APP Store审核太慢?大神分享快速审核的小技巧

    这节课要来跟大家讲讲怎样可以快速的有效的通过苹果的审核,大家可能也有听说过苹果的快审,苹果的审核流程除了机器审核还有一个人工的审核,以前的苹果审核时用到的时间也是不短,一些有经验的开发者可能也会发现在 ...

  10. 数据链路层--PPP协议

    数据链路层使用的信道主要有两种类型:点对点信道和广播信道. 点对点 路由器在转发分组时只使用了下面的三层. 链路是从一个结点到相邻结点的一段物理线路,中间没有其他交换结点. 必须有一些必要的通信协议来 ...