快排找第k大(小)元素
来源:互联网 发布:java单例模式双重锁 编辑:程序博客网 时间:2024/05/20 22:02
第K极值
我调了整整一个下午终于tmd过了,对自己的智商产生了严重的怀疑。
一开始写了一个40分的,跟正确答案只差一点估计是边界没搞好,我也懒得查了,先睡一觉再说吧,真烦。
40分的sort函数
int qsort(int l,int r){if(r==l)return a[l];int s=a[l];int p1=l+1,p2=r; while(p1<p2) { while(a[p2]>=s&&p1<p2) p2--; while(a[p1]<=s&&p1<p2) p1++; if(p1<p2) swap(a[p1],a[p2]);}swap(a[l],a[p1]);if(k>p1)return qsort(p1+1,r);else if(k<p1)return qsort(l,p1-1); else if(k==p1) return a[p1];}
等我睡醒了再查错好了。
之前一直没有手写过快排,对基准数的理解可能有些偏差,后来重新写了一遍才AC;
#include<iostream>#include<cmath>using namespace std;int a[1000001];int k;int qsort(int l,int r){if(l<r){int i=l,j=r,x=a[l];while(i<j){while(a[j]>=x&&i<j) j--;while(a[i]<=x&&i<j) i++;if(i<j)swap(a[i],a[j]);}a[l]=a[i];a[i]=x;if(k==i)return a[i];else if(k<i)return qsort(l,i-1);elsereturn qsort(i+1,r);}else return a[l];}int main(){int n; cin>>n>>k;for(int i=1;i<=n;i++)cin>>a[i];int c=qsort(1,n); k=n+1-k; int d=qsort(1,n); int ans=d-c; if(ans<2){ cout<<"NO"<<endl; cout<<ans<<endl; return 0; } bool j=0;for(int i=2;i<=sqrt(ans);i++){if(ans%i==0){j=1;break;}}if(j==1)cout<<"NO"<<endl;else cout<<"YES"<<endl;cout<<ans<<endl;cout<<endl;return 0;}
竟然比直接排序还慢真可怕,不知道是我写错了还是数据量太小,题目说n<=10000感觉不至于吧,真烦。
—————————————————————————————————————————————————————————————————————————————
第一个代码得40分的原因是一开始p1=l+1了,应该p1=l 。
0 0
- 快排找第k大(小)元素
- HDU 4006 第K大元素(小技巧)
- 寻找前k大元素或者前k小元素
- 数组中第k大(或小)的元素(leetcode215)
- 求数组中给定下标区间内的第K小(大)元素
- 寻找给定区间内的第k小(大)的元素
- 求两个已排序的数组中所有元素的第K大(小)
- 若干个(大量)数字中找前K大/小的元素--数值型
- 若干个(大量)数字中找前K大/小的元素--数值型
- 寻找第k小的元素或者第k大的元素 -- O(n)
- 在随机序列中,利用冒泡排序查找第K小(或者第K大)的元素
- 第k大元素
- 第k大元素
- 第k大元素
- 第K小元素问题(C++)
- 第K小元素
- 第 k 小 元素
- 查找数组中第K大和第K小的元素
- 伪指令,预编译
- Application failed to start because it could not find or load the QT platform plugin “windows”
- 【SSH进阶之路】Hibernate基本原理(一)
- jsp自定义标签显示bean信息
- --Listener (一)Listener简介
- 快排找第k大(小)元素
- Restful CRUD
- 后记
- c++primer第十五章面向对象设计小结-15
- 二叉树遍历应用(dfs)124. Binary Tree Maximum Path Sum
- Windows下Python多版本共存
- Android进阶之自定义注解
- html5 css布局
- 继续内存结构问题