参考博客:传送门

在上面的博客中介绍了求序列第K大的几种算法,感觉收益良多,其中最精巧的还是利用快速排序的思想O(n)查询的算法。仔细学习以后我将其中的几个实现了一下。

解法 1:

将乱序数组从大到小进行排序然后取出前K大,总的时间复杂度为O(nlogn)

解法 2:

利用选择排序或交互排序,取出前K大,总的时间复杂度为O(nk)

解法 3:

借鉴快速排序的思想,复杂度近似为O(n)

#include<cstdio>
#include<algorithm>
#include<cstdlib>
using namespace std;int kth_number(int *a,int l,int r,int k)
{if(r-l == 1) return a[l];int key=a[l];int index=l;for(int i=l+1;i<r;++i){if(a[i]>=key) continue;else{++index;swap(a[i],a[index]);}}swap(a[index],a[l]);if(r-index == k) return a[index];if(r-index-1 >= k) return kth_number(a,index+1,r,k);else return kth_number(a,l,index,k-r+index);
}

测试程序

#include<cstdio>
#include"Kth_number.h"using namespace std;int main()
{int n,k;const int MAXN=1005;int a[MAXN];printf("n="); scanf("%d",&n);printf("k="); scanf("%d",&k);if(k>n) k=n;printf("please input %d number:\n",n);for(int i=0;i<n;++i)scanf("%d",&a[i]);printf("the %dth number of array is %d\n",k,kth_number(a,0,n,k));return 0;
}

运行结果

解法 4:

借助堆排序的思想,将前K个数字弹出,复杂度为建立堆的O(4n)加上k次堆排序O(logn)O(4n+klogn)

实现程序

#include<cstdio>
#include<cstdlib>
#include<climits>
#include<algorithm>
#include<sys/types.h>
#include<sys/wait.h>
#include<fcntl.h>
#include<unistd.h>using namespace std;void Adjust(int *a, int n, int i)
{int x = a[i];for(int k = i<<1; k <= n; k = k<<1){if(k+1 <= n && a[k] < a[k+1])++k;if(a[k] > x){a[i] = a[k];i = k;}else{break;}}a[i] = x;
}void MakeHeap(int *a, int n)
{for(int i = n/2;i > 0;--i){Adjust(a, n, i);}
}void HeapSort(int *a,int n,int k,int *ans)
{int m=n-k;for(int i = n; i > m; i--){swap(a[1], a[i]);Adjust(a, i-1, 1);}*ans = a[m+1];
}int main(int argc, char* argv[])
{int n;const int MAXN = 1024;scanf("%d", &n);int a[MAXN] = {0};for(int i = 1; i <= n; ++i){scanf("%d", &a[i]);}int k;scanf("%d", &k);if(k > n) k = n;MakeHeap(a, n);int ans;HeapSort(a, n, k, &ans);printf("ans=%d\n", ans);return 0;
}

测试结果

解法 5:

维护一个大小为k的小顶堆,对于数组中的每一个元素判断与堆顶的大小,若堆顶较大,则不管,否则弹出堆顶,将当前值插入到堆中。时间复杂度O(4k+nlogk)

实现程序

#include<cstdio>
#include<cstring>using namespace std;void Adjust(int *a,int n,int i)
{int x=a[i];for(int k=i<<1;k<=n;k<<=1){if(k+1<=n && a[k]>a[k+1])++k;if(a[k]<x){a[i]=a[k];i=k;}else break;}a[i]=x;
}
void MakeHeap(int *a,int n)
{for(int i=n/2;i>0;--i){Adjust(a,n,i);}
}
int KthNumber(int *a,int n,int k)
{//  int *b=new int[k];int b[1024];for(int i=1;i<=k;++i){b[i]=a[i];}MakeHeap(b,k);for(int i=k+1;i<=n;++i){if(a[i]>b[1]){b[1]=a[i];Adjust(b,k,1);}}return b[1];
}int main()
{int n,k;printf("n="); scanf("%d",&n);printf("k="); scanf("%d",&k);
//  int* a = new int[n];int a[1024]={0};for(int i=1;i<=n;++i)scanf("%d",&a[i]);printf("%d\n",KthNumber(a,n,k));
//  delete a;return 0;
}

测试结果

解法 6:

利用Hash保存数组中元素出现的次数,利用计数排序的思想,线性从大到小扫描中得到结果,时间复杂度为O(n)

求序列第K大算法总结相关推荐

  1. POJ 2182 Lost Cows (求序列第k大)

    题解 二分+树状数组 显然最和一个数的值就是rank 那么其它数有什么规律? 从后往前匹配rank,我们可以发现第i个数的rank为还没有匹配的rank第(a[i]+1)大的数 这可以用 树状数组+二 ...

  2. 单峰数组求第k大算法

    单峰数组实际上可以看成两个有序的数组,这个问题就转变成了两个有序数组求第k大. 容易想到的算法是对这两个数组进行归并,生成一个新的有序数组,求出第k大之后就可以立刻停止,复杂度是O(k)的. 但是还有 ...

  3. 0206.BFPRT在一大堆数中求其前k大或前k小的问题,简称TOP-K问题(左神算法基础班源码)

    package basic_class_02;/*** * 在一大堆数中求其前k大或前k小的问题,简称TOP-K问题.* 而目前解决TOP-K问题最有效的算法即是BFPRT算法**/ public c ...

  4. O(n)复杂度求区间第K大

    O(n)复杂度求区间第K大 描述 给你一个数组,O(N)复杂度找出其中第K大的数. 输入 第一行包括两个数,N,K,分别代表数组大小,以及你应该找出第K大的数. 接下来N行,每行包括一个数. ​ 输出 ...

  5. 可持久化Trie+堆优化 OR Trie树上求XOR第K大 ---- P5283 [十二省联考2019]异或粽子

    题目大意 题目大意: 考虑先做个 prefix xor 前缀异或bi=⨁j=1iaj(1≤i≤n)b_i=\bigoplus_{j=1}^{i}a_j(1\leq i \leq n)bi​=j=1⨁i ...

  6. C++实现求数组中前K大的数

    参考:http://blog.csdn.net/xiaoding133/article/details/8037086 C++实现求数组中前K大的数,即求数组的最大的k个数 //数组中求最大的k个数 ...

  7. 整体二分求区间第k大模板(POJ 2104)

    自己的模板,线段树实现的,可以参考一下 算法步骤 参考一下文章 http://www.cnblogs.com/dirge/articles/5810855.html https://www.cnblo ...

  8. 9个元素换6次达到排序序列_十大算法排序(Sorting Algorithm) Study notes

    (自己手打的python实现代码以及整理的各路大神总结的知识点) 自用学习笔记,由于基于北美cs学习,文章大量中英混杂(谨慎食用) 十大排序算法: 插入排序 1)Insertion Sort 简单插入 ...

  9. hdu2852(2009多校第四场) 树状数组求区间第k大的数 两种方法

    二分查找n*logn*logn 比较容易理解 1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm& ...

最新文章

  1. 【Mybatis】resultMap继承
  2. android 事件传递
  3. stc单片机c语言 pdf,STC单片机C语言程序设计 第13章 STC单片机C语言指针.pdf
  4. python - classs内置方法 solt
  5. “四不像”病毒冒充多款知名软件 窃取电脑隐私
  6. eclipse编写wordcount提交spark运行
  7. 用linux装逼-w3m
  8. spss案例教程主成分分析与因子分析及SPSS实现
  9. 手把手搭建K3cloud插件开发环境
  10. 知识图谱05:知识图谱构建涉及的技术
  11. 【STM8】STM8在STVD平台生成HEX和S19文件的方法
  12. java 使用Lambda对集合排序
  13. 设计模式之原型模式【选用鸣人影分身阐述】
  14. php完美导出word,php导出生成word的方法
  15. ResourceAccessException: I/O error on POST request for “http://localhost:9411/api/v2/spans“
  16. 行秩列秩一定相等吗_从不同角度看行秩与列秩
  17. 2019网易校园招聘 - 算法平台开发工程师
  18. 数据库之十二星座 --- 双鱼座的复杂关系
  19. VR中的动画就是这么玩哒
  20. 密码学之凯撒加密解密算法

热门文章

  1. 五、创建Bean的三种方式
  2. C语言结构体及函数传递数组參数演示样例
  3. Android-Binder 简析
  4. [转]粵語固有辭彙與漢語北方話辭彙對照
  5. CocoaAsyncSocket 套接字
  6. java 唯一索引冲突_JPA merge联合唯一索引无效问题解决方案
  7. global.min.css,css3-媒体查询样式不覆盖原始样式
  8. 里公式后面标号怎么对齐_你若会用Word里F4键,又何须加班到半夜?
  9. python matplotlib数据可视化教程_matplotlib的Python数据可视化和探索——入门指南
  10. 曝光原理_泰国精戈咖啡效果反馈 作用原理曝光