#include "iostream.h"
using namespace std;
int findMedian(int *A,int left,int right){
int center = (left+right)/2;
if(A[left]>A[center]){
swap(A[left],A[center]);
}
if(A[left]>A[right]){
swap(A[left],A[right]);
}
if(A[center]>A[right]){
swap(A[center],A[right]);
}
//A[right]已经大于A[center]
swap(A[center],A[right-1]);
return A[right-1]; }
void insertSort(int *A, int left,int right){ for(int i=left+1;i<=right;i++){
int p = A[i];
int j;
for( j=i;j>=left&&A[j-1]>p;j--){
A[j]=A[j-1];
}
A[j]=p;
}
}
#define CUTOFF 5
int qselect(int *A, int k, int left,int right){
if(left+CUTOFF<right){
int pivot = findMedian(A,left,right); int i=left;
int j=right-1;
for(;;){
while(A[++i]<pivot){}
while(A[--j]>pivot){}
if(i<j){
//此时A[i]>=pivot&&A[j]<=pivot,交换二者位置
swap(A[i],A[j]);
}else
break;
}
swap(A[i],A[right-1]);
int t = i-left+1;
if(k==t)
return A[i];
else if(k<t){
return qselect(A,k,left,i-1);
}else{
return qselect(A,k-t,i+1,right);
}
}else{
insertSort(A,left,right);
return A[k+left-1];
}
}
int main()
{
int A[100];
int N;
cin>>N;
for(int i=0;i<N;i++){
cin>>A[i];
}
int k;
cin>>k; if(k<=N-0)
cout<<qselect(A,k,0,N-1)<<endl;
return 0;
}

快排查找第K小的数的更多相关文章

  1. 查找第K小的数 BFPRT算法

    出处 http://blog.csdn.net/adong76/article/details/10071297 BFPRT算法是解决从n个数中选择第k大或第k小的数这个经典问题的著名算法,但很多人并 ...

  2. 2018.4.24 快排查找第K大

    import java.util.Arrays; /* 核心思想:利用快排思想,先假定从大到小排序,找枢纽,枢纽会把大小分开它的两边,当枢纽下标等于k时, 即分了k位在它左边或右边,也就是最大或最小的 ...

  3. 820复试算法 快排找第 k 小

    done {20-01-30 12:56} ref: https://blog.csdn.net/fengsigaoju/article/details/50728588 note: void qui ...

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

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

  5. 算法---数组总结篇2——找丢失的数,找最大最小,前k大,第k小的数

    一.如何找出数组中丢失的数 题目描述:给定一个由n-1个整数组成的未排序的数组序列,其原始都是1到n中的不同的整数,请写出一个寻找数组序列中缺失整数的线性时间算法 方法1:累加求和 时间复杂度是O(N ...

  6. LeetCode:乘法表中的第K小的数【668】

    LeetCode:乘法表中的第K小的数[668] 题目描述 几乎每一个人都用 乘法表.但是你能在乘法表中快速找到第k小的数字吗? 给定高度m .宽度n 的一张 m * n的乘法表,以及正整数k,你需要 ...

  7. 719. 找出第 K 小的数对距离

    719. 找出第 K 小的数对距离 这道题其实有那么一点二分猜答案的意思,也有很多类似题目,只不过这道题确实表达的不是很清晰不容易想到,题没问题,我的问题.既然是猜答案,那么二分边界自然就是距离最大值 ...

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

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

  9. 计算序列中第k小的数

    作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4046399.html 使用分治算法,首先选择随机选择轴值pivot,并使的序列中比pivot ...

随机推荐

  1. AJAX 与 MySQL

    AJAX 与 MySQL AJAX 可用来与数据库进行交互式通信. AJAX 数据库实例 下面的实例将演示网页如何通过 AJAX 从数据库读取信息: 实例   Select a person:   P ...

  2. 开放数据库互联ODBC配置(odbcconf)

    开放数据库互连(ODBC)是微软引进的一种早期数据库接口技术,通过ODBC驱动程序可访问数据库数据:使用ODBC管理器可以完成对数据库的链接操作.笔者利用ODBC接口,将WINDOWS计数器信息写入到 ...

  3. WP8下实现刮刮乐(橡皮擦)功能

    说到刮刮乐这个功能,我们最先想到的是上下两张(长方形)重叠,之后对上面这张图片进行操作. 我的想法是:通过手势,让手指划过的地方变成透明的,底部就会显示了. 那如何让图片变为透明呢?这就要对图片的像素 ...

  4. APP常用字体

    font-family:Microsoft YaHei,Helvitica,Verdana,Tohoma,Arial,san-serif;

  5. 2012 Multi-University Training Contest 9 / hdu4389

    2012 Multi-University Training Contest 9 / hdu4389 打巨表,实为数位dp 还不太懂 先这样放着.. 对于打表,当然我们不能直接打,这里有技巧.我们可以 ...

  6. PHP正则表达式详解(三)

    1.preg_match() :preg_match() 函数用于进行正则表达式匹配,成功返回 1 ,否则返回 0 . 语法:int preg_match( string pattern, strin ...

  7. bash 语法使用

    1.定义函数时,不需要使用function作为函数的命名. 函数不需要形参. 函数名不能以数字作为开头 main() { in ) 1_start ;; ) 1_start 5_start ;; ) ...

  8. poj 1695

    用动态规划,dp[a][b][c]表示从位置最大的车在a(注意不是第一辆车),第二的车在b,第三的车在c开始最少需要的时间. 方程:dp[a][b][c]=max{dp[a+1][b][c],     ...

  9. BZOJ2435——[Noi2011]道路修建

    1.题意:给个树,边的权值=两边的点数差*此边的长度,求所有边的权值和 2.分析:真不想说啥了...dfs即可 #include <cmath> #include <cstdio&g ...

  10. AssetBundle loading failed because.....已解决

    http://blog.csdn.net/ldghd/article/details/9632455 *****************************      一      ******* ...