本文提供了一种基于分治法思想的,查找第K个大的数,可以使得时间复杂地低于nlogn. 因为快排的平均时间复杂度为nlogn,但是快排是全部序列的排序,

本文查找第k大的数,则不必对整个序列进行排序。请看本文:

说明本文为原创文章,转载请注明出自:丰泽园的天空-快速排序及查找第K个大的数

 #include<stdio.h>
#include<stdlib.h>
/* 如何查找第k小的数,或者第k大的数*/
partition(int data[],size_t left ,size_t right)
{
int i = left;
int j = right;
int p = (left + right) / ;
int pivot = data[p];
while(i < j){
for(; i < p && data[i] <= pivot;++i);
if(i < p) {
data[p] = data[i];
p = i;
}
for(; j > p && data[j] >= pivot; --j);
if( j > p){
data[p] = data[j];
p = j;
}
}
data[p] = pivot;
return p; }
int quick_sort(int data[],size_t left, size_t right)
{
if(left < right){
int index = partition(data,left,right);
if(index - left > )
quick_sort(data,left, index-);
if(right - index > )
quick_sort(data,index + , right); } }
int findK(int data[], size_t left, size_t right, size_t k){
if(left < right){
int mid = partition(data,left, right);
if(mid - left + >= k)
findK(data,left, mid, k );
else
findK(data, mid + , right, k- (mid - left +));
} }
int main()
{
int data[] = {,, , ,,,-, ,};
int len = sizeof(data)/sizeof(data[]);
// quick_sort(data,0,len - 1);
int i =;
/* 打印原始序列 */
for( i = ; i < len ; ++i)
{
printf(" %d ",data[i]);
}
findK(data,,len - , );
printf("x = %d\n", data[] );
/* 找到第k个大的数后,序列的变化为:---快排之前*/
for( i = ; i < len ; ++i)
{
printf(" %d ",data[i]);
}
printf("\n");
/* 快排之后的序列*/
quick_sort(data,,len - );
for( i = ; i < len ; ++i)
{
printf(" %d ",data[i]);
}
printf("\n"); }

说明:查找第K个大的数,用到是分治法的思想。联想到快排中,完成一次排序,左边的序列比基准值小,右边的序列比基准值大,只要确定第k个大数在哪个序列中,只要对这个子序列进行排序即可。

快速排序及查找第K个大的数。的更多相关文章

  1. 在二叉搜索树(BST)中查找第K个大的结点之非递归实现

    一个被广泛使用的面试题: 给定一个二叉搜索树,请找出其中的第K个大的结点. PS:我第一次在面试的时候被问到这个问题而且让我直接在白纸上写的时候,直接蒙圈了,因为没有刷题准备,所以就会有伤害.(面完的 ...

  2. 认真对待每一道算法题 之 两个排序好的数组寻找的第k个大的数

    转载博客:http://www.cnblogs.com/buptLizer/archive/2012/03/31/2427579.html 题目意思:给出两个排好序的数组 ,不妨设为a,b都按升序排列 ...

  3. 求数组前K个大的数

    我们举例,假若从10000万个数里选出前100个最大的数据. 首先我们先分析:既然要选出前100个最大的数据,我们就建立一个大小为100的堆(建堆时就按找最大堆的规则建立,即每一个根节点都大于它的子女 ...

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

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

  5. 基于快速排序思想partition查找第K大的数或者第K小的数。

    快速排序 下面是之前实现过的快速排序的代码. function quickSort(a,left,right){ if(left==right)return; let key=partition(a, ...

  6. 清橙OJ 1082 查找第K小元素 -- 快速排序

    题目地址:http://oj.tsinsen.com/A1082 问题描述 给定一个大小为n的数组s和一个整数K,请找出数组中的第K小元素. 这是一个补充程序的试题,你需要完成一个函数: int fi ...

  7. 如何用快排思想在O(n)内查找第K大元素--极客时间王争《数据结构和算法之美》

    前言 半年前在极客时间订阅了王争的<数据结构和算法之美>,现在决定认真去看看.看到如何用快排思想在O(n)内查找第K大元素这一章节时发现王争对归并和快排的理解非常透彻,讲得也非常好,所以想 ...

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

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

  9. POJ 2985 The k-th Largest Group(树状数组 并查集/查找第k大的数)

    传送门 The k-th Largest Group Time Limit: 2000MS   Memory Limit: 131072K Total Submissions: 8690   Acce ...

随机推荐

  1. django【ORM】 通过外键字段找对应类

    两个方法其实是一种,用哪个都行,看实例:   方法一: 从list_filter中的字符串,找到model对象的字段,然后得到这个外键对应的类 循环,把list_filter中对应的类所有对象 方法二 ...

  2. 【Python学习】字符编码

    先说两个基础知识. (1)计算机内部,数据是由0,1组成的: (2)计算机最小的数据单位,就是一个二进制单位即bit,接下来就是8个二进制单位表示一个字节(Byte). 1 ASCII码 ASCII码 ...

  3. spring-mybatis.xml配置

    1.自动扫描 <context:component-scan base-package="com.javen" /> 2.引入配置文件 <bean id=&quo ...

  4. samba中的pdbedit用法

    pdbedit用于在samba服务器中创建用户: 它的用法包括 pdbedit -a username:新建Samba账户. pdbedit -x username:删除Samba账户. pdbedi ...

  5. ASP.NET Core 2.0 MVC 发布部署--------- ASP.NET Core 发布的具体操作

    ASP.NET Core 发布的具体操作 下面使用C# 编写的ASP.NET Core Web项目示例说明发布的全过程. 1.创建项目 选择“文件” > “新建” > “项目”. 在“添加 ...

  6. linux CentOS 上安装chrome

    1.wget http://chrome.richardlloyd.org.uk/install_chrome.sh   (用wget下载shell文件)2.chmod u+x install_chr ...

  7. ISSCC 2017论文导读 Session 14:A 288μW Programmable Deep-Learning Processor with 270KB On-Chip Weight

    A 288μW Programmable Deep-Learning Processor with 270KB On-Chip Weight Storage Using Non-Uniform Mem ...

  8. Base Class 慎用箭头函数

    在项目中,child继承base的时候,需要重新修改base.fun的逻辑,但是有些情况下面并不是简单的覆盖,而是在base.fun的逻辑基础上进行加工处理. 刚开始接触es6的时候也许都遇到过,ch ...

  9. Download failed : Oracle JDK 7 is NOT installed,解决oracle jdk7的问题

    先了解下概念: jdk(java development kit),就是java的开发工具集,顾名思义就是做开发用的,其中包括javac,也就是java compiler等.jre(java runt ...

  10. DotNetOpenAuth实践之Windows签名制作

    系列目录: DotNetOpenAuth实践系列(源码在这里) 在上篇中我们搭建了一个简单的认证服务器,里面使用到了Windows签名证书,这一篇则是教大家如何制作Windows签名证书,下面进入正题 ...