本文提供了一种基于分治法思想的,查找第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. java-String中的 intern()

    1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. ne ...

  2. juery下拉刷新,div加载更多元素并添加点击事件(二)

    buffer.append("<div class='col-xs-3 "+companyId+"' style='padding-left: 10px; padd ...

  3. cocos2d-x android 添加新场景报错: undefined reference to `vtable for XXX'

    转载自 居家懒人 http://www.cnblogs.com/JD85/archive/2012/09/17/2688128.html 加入写了新场景SecondScene,结果在cpp文件里类名地 ...

  4. vsftpd.conf 详解

    //不允许匿名访问 anonymous_enable=NO //设定本地用户可以访问.注意:主要是为虚拟宿主用户,如果该项目设定为NO那么所有虚拟用户将无法访问 local_enable=YES // ...

  5. bzoj 2819(DFS序+树状数组+博弈+lca)

    2819: Nim Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 2045  Solved: 795[Submit][Status][Discuss] ...

  6. office 文档转pdf

    本地先安装 金山wps,并确保可用 工程目录 1.使用前,先执行install.bat 安装jacob 到maven本地仓库 2.复制 jacob-1.18-M2-x64.dlljacob-1.18- ...

  7. Robot Framework Selenium学习博客

    http://blog.csdn.net/tulituqi/article/details/21888059

  8. HTML如何创建二级目录

    #classify ul li div{width:100px;  height:200px;  display:none;  position:absolute;  left:100px;  top ...

  9. IP地址输入框

    <style> div.IPDiv{background:#ffffff;width:120;font-size:9pt;text-align:center;border:2 ridge ...

  10. ssh自动登录(免密)

    创建公钥 1 ssh-keygen -t rsa 无视它出来的任何提示,欢快的一路回车到底吧~ 把公钥复制到远程主机 把公钥id_rsa.pub复制到远程机器的 /home/username/.ssh ...