本文提供了一种基于分治法思想的,查找第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. python基础之内置异常对象

    前言 什么叫异常?简单来说就是程序运行发生了预计结果之外的情况从而导致程序无法正常运行.而python解释器将一些常见的异常情况在它发生时打包成一个异常对象,我们可以通过捕捉这些异常对象从而进行处理, ...

  2. LCD驱动分析【转】

    转自:http://blog.csdn.net/hanmengaidudu/article/details/21559153 1.S3C2440上LCD驱动 (FrameBuffer)实例开发讲解 其 ...

  3. 《30天自制操作系统》笔记(01)——hello bitzhuwei’s OS!【转】

    转自:http://www.cnblogs.com/bitzhuwei/p/OS-in-30-days-01-hello-bitzhuwei-OS.html 阅读目录(Content) 最初的OS代码 ...

  4. github--403错误

    错误信息如下: $ git push origin master error: The requested URL returned error: while accessing https://gi ...

  5. C/C++——C语言库函数大全

    本文转载自:https://blog.csdn.net/yanfan0916/article/details/6450442###; 1. 分类函数: ctype.h  int isalpha(int ...

  6. 进度条算法 progressBar

    ; ;var maxNum=int.MaxValue; progressBar.Maximum =maxNum; progressBar.Minimum = ; progressBar.Value = ...

  7. bash: composer: command not found

    下载composer到本地:curl -sS https://getcomposer.org/installer | php 移动至系统服务:sudo mv composer.phar /usr/bi ...

  8. Photon3Unity3D.dll 解析三——OperationRequest、OperationResponse

    OperationRequest 代表Operation操作的Request,包含Code和Parameters OperationCode  Byte类型的值,代表操作,由LiteOpCode定义了 ...

  9. MVC开发模式与javaEE三层架构

    1.MVC开发模式 1. M:Model,模型.JavaBean        * 完成具体的业务操作,如:查询数据库,封装对象2. V:View,视图.JSP        * 展示数据3. C:C ...

  10. POJ 3616 Milking Time(最大递增子序列变形)

    题目链接:http://poj.org/problem?id=3616 题目大意:给你时间N,还有M个区间每个区间a[i]都有开始时间.结束时间.生产效率(时间都不超过N),只能在给出的时间段内生产, ...