好像有些大公司出过面试题:找出数组里面第N大的数,当然有点变化,但本质部分是这样的.

  要求是不能排序,时间复杂度不能超过O(n^2)

  思路很多,我暂时就只会快排衍生的那种.如果对快速排序不太熟悉了,建议复习  我之前讨论的快速排序.

  

  好的,现在假设你已经熟悉了快速排序.

  每轮快排,我们都得找个支点,然后从数组的两边交替开始和支点比较,右边比支点小的数移到左边,左边比支点大的数移到右边,移到最后,只剩一个位置了,然后把支点填进来.这时,你发现在支点右边的数都比支点大.假设支点的index等于i,然后支点是第(endIndex-i+1)大的数了.(注意:endIndex是数组最后一个元素的下标)

  记住我们的目标,我们的目标是要找第N大的数,如果endIndex -i + 1 = n,就说明我们找到了.但是2个数比较有3种结果.我们来分情况讨论下:

  记th = endIndex - i + 1,find(a, startIndex, endIndex, n)

  (1) th = n,返回支点

  (2) th > n,说明第n大的数在支点右边,所以在右边继续找:find(a, i + 1, endIndex, n)

  (3) th < n,说明第n大的数在支点左边,右边的数都比要找的数大,也比支点大,所以只需要在左边找第(n - th)大的数即可,find(a, startIndex, i - 1, n - th)

  

代码:

#include<stdio.h>
#include<stdlib.h> int choose_nth(int a[],int startIndex, int endIndex, int n); int main(int argc, char *argv)
{
int a[] = {,,,,,,};
int n,i;
int an = sizeof(a)/sizeof(int); printf("数组:\n");
for(i = ; i < an; ++i)
printf("%d ",a[i]);
printf("\n"); printf("想找第几大的数:");
scanf("%d",&n); int ans = choose_nth(a, , an - , n);
printf("第%d大的数是:%d\n", n, ans);
return ;
} int choose_nth(int a[], int startIndex, int endIndex, int n)
{
int midOne = a[startIndex];
int i = startIndex, j = endIndex;
if(i == j) //递归出口之一
return a[i]; if(i < j)
{
while(i < j)
{
for(; i < j; j--)
if(a[j] < midOne)
{
a[i++] = a[j];
break;
}
for(; i < j; i++)
if(a[i] > midOne)
{
a[j--] = a[i];
break;
}
}
a[i] = midOne;//支点归位 int th = endIndex - i + ;//计算下标为i的数第几大 if(th == n)//正好找到
{
return a[i];
}
else
{
if(th > n )//在支点右边找
return choose_nth(a, i + , endIndex, n);
else//在支点左边找第(n-th)大,因为右边th个数都比支点大
return choose_nth(a, startIndex, i - , n - th);
}
} }

输出结果:

数组:

想找第几大的数:
第4大的数是:

输出数组里面第N大的数的更多相关文章

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

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

  2. 无序数组中第Kth大的数

    题目:找出无序数组中第Kth大的数,如{63,45,33,21},第2大的数45. 输入: 第一行输入无序数组,第二行输入K值. 该是内推滴滴打车时(2017.8.26)的第二题,也是<剑指of ...

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

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

  4. 无序数组求第K大的数

    问题描述 无序数组求第K大的数,其中K从1开始算. 例如:[0,3,1,8,5,2]这个数组,第2大的数是5 OJ可参考:LeetCode_0215_KthLargestElementInAnArra ...

  5. (算法)两个有序数组的第k大的数

    题目: 有两个数组A和B,假设A和B已经有序(从大到小),求A和B数组中所有数的第K大. 思路: 1.如果k为2的次幂,且A,B 的大小都大于k,那么 考虑A的前k/2个数和B的前k/2个数, 如果A ...

  6. 算法题之找出数组里第K大的数

    问题:找出一个数组里面前K个最大数. 解法一(直接解法): 对数组用快速排序,然后直接挑出第k大的数.这种方法的时间复杂度是O(Nlog(N)).N为原数组长度. 这个解法含有很多冗余,因为把整个数组 ...

  7. 每天一道算法题(32)——输出数组中第k小的数

    1.题目 快速输出第K小的数 2.思路 使用快速排序的思想,递归求解.若键值位置i与k相等,返回.若大于k,则在[start,i-1]中寻找第k大的数.若小于k.则在[i+1,end]中寻找第k+st ...

  8. [经典] 在未排序数组中返回topK大的数

    解法一,排序 先从大到小快排,然后扫前K个返回 时间复杂度:O(NlogN),空间复杂度O(1) 解法二,优先队列 前K个放入优先队列中,与最小堆顶元素比较大小,若大于则删除堆顶并插入:否则跳过 时间 ...

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

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

随机推荐

  1. 优化函数式编程:向 PHP 移植 Clojure 函数

    许多通用程序设计语言试图兼容大多数编程范式,PHP 就属于其中之一.不论你想要成熟的面向对象的程序设计,还是程序式或函数式编程,PHP 都可以做到.但我们不禁要问,PHP 擅长函数式编程吗?本文系国内 ...

  2. Access forbidden! XAMPP虚拟主机的问题

    XAMPP Control Panel v3.2.1添加虚拟主机出现 Access forbidden! You don't have permission to access the request ...

  3. Java中对List集合排序的两种方法

    第一种方法,就是list中对象实现Comparable接口,代码如下: public class Person implements Comparable<Person> { privat ...

  4. (转载)NET流操作

    http://www.oseye.net/user/kevin/blog/86 概念 数据流(Stream)是对串行传输数据的一种抽象表示,是对输入/输出的一种抽象.数据有来源和目的地,衔接两者的就是 ...

  5. 【HDOJ】1088 Write a simple HTML Browser

    题目其实不难,但是要注意题目的要求,当前字数(>0)+当前单词长度+1若超过80则需要回车后,输出当前word,并且重新计数.这道题目的数据感觉比较水,不过测试的时候,最后使用fprintf输出 ...

  6. Java Memory Management(1)

    Java Memory Management, with its built-in garbage collection, is one of the language’s finest achiev ...

  7. BZOJ_1626_[Usaco2007_Dec]_Building_Roads_修建道路_(Kruskal)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1626 给出\(n\)个点的坐标,其中一些点已经连通,现在要把所有点连通,求修路的最小长度. 分 ...

  8. ☀【JS】eval

    避免使用 eval <!doctype html> <html lang="zh-CN"> <head> <meta charset=&q ...

  9. Linux下归档与压缩工具笔记

    tar具体使用笔记 归档工具 tar 语法 功能 选项 常见搭配 压缩工具 bzip2 工具 使用方法 gzip 工具 zip 工具 归档工具 tar tar是一个开源的Linux/Unix中最广泛使 ...

  10. JS中String,Math常用函数

    String对象: 1.length属性 说明:获取字符串的长度 实例: var str="abc"; var i=str.length;//output:3 2.charAt() ...