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. Ubuntu环境变量配置

    根目录下的.bashrc文件中配置环境变量 export JAVA_HOME=/home/zn/softpackage/jdk1. export CLASSPATH=${JAVA_HOME}/lib ...

  2. 019_Map Task数目的确定和Reduce Task数目的指定

    注意标题:Map Task数目的确定和Reduce Task数目的指定————自然得到结论,前者是后者决定的,后者是人为指定的.查看源码可以很容易看懂 1.MapReduce作业中Map Task数目 ...

  3. linux中安装php

    1.在php官网找到对应的php版本下载下来(php官网地址http://php.net) 2.把下载下来的安装包放入到linux系统中 3.解压php压缩包,通过tar -zxvf  +  下载下来 ...

  4. Python自然语言处理系列之模拟退火算法

    1.基本概念 模拟退火算法(Simulated Annealing,SA)是一种模拟固体降温过程的最优化算法.其模拟的过程是首先将固体加温至某一温度,固体内部的粒子随温度上升慢慢变为无序的状态,内能增 ...

  5. [Papers]Finding Advertising Keywords on Web Pages

    参考资料: Finding Advertising Keywords on Web Pages ,Wen-tau Yih,Joshua Goodman, Vitor R. Carvalho

  6. 【leetcode刷题笔记】Multiply Strings

    Given two numbers represented as strings, return multiplication of the numbers as a string. Note: Th ...

  7. 通过调节坐标进行jfree图的放大缩小

    http://blog.csdn.net/lt1983lt/article/details/5665085 import Java.awt.BorderLayout;import java.awt.C ...

  8. request模块 一基础部分

    一.HTTP请求   通过requests发送网络请求,方法有get post put delete head options import requests r=requests.get(" ...

  9. cocos2dx打飞机项目笔记六:GameScene类和碰撞检测 boundingbox

    GameScene类虽然是占用游戏最多时间的类,但是里面的东西不是很多,最重要的就是碰撞检测了,碰撞检测代码如下: void GameScene::detectionCrash() { CCArray ...

  10. UI基础_transform

    #import "ViewController.h" typedef enum { ButtonTypeLeft = 1, ButtonTypeRight, ButtonTypeU ...