求n个数中第k大的数、前K大的数、快速排序
来源:互联网 发布:nginx 缓存静态文件 编辑:程序博客网 时间:2024/04/30 13:49
- 求n个数中第k大的数
- #include <cstdlib>
- #include <iostream>
- /**
- *求一个数组中的第k大数
- *基本思想:
- *以最后一个元素x为轴,把数组分为两部分Sa和Sb。Sa中的元素大于等于X,Sb中元素小于X。这时有两种情况:
- *1.Sa中元素的个数小于k,则Sb中的第k-|Sa|个元素即为第k大数;
- *2.Sa中元素的个数大于等于k,则返回Sa中的第k大数。
- *时间复杂度近似为O(n)
- */
- using namespace std;
- void exchange(int &a,int &b)
- {
- int temp;
- temp=a;
- a=b;
- b=temp;
- }
- //快排的partition函数
- int partition(int *a,int l,int r)
- {
- int i=l-1,j=l;
- int x=a[r];
- int temp;
- for(j=l;j<r;j++)
- {
- if(a[j]>=x) //把比x大的数往前放
- {
- exchange(a[j],a[i+1]);
- i++;
- }
- }
- exchange(a[r],a[i+1]);
- return i+1;
- }
- int k_element(int *a,int l,int r, int k)
- {
- if(l>=r)
- return a[l];
- int q=partition(a,l,r);
- if(q==k-1)
- return a[q];
- else if(q>=k)
- return k_element(a,l,q-1,k); //Sa中元素个数大于等于k
- else
- return k_element(a,q+1,r,k-(q+1)); //Sa中元素个数小于k
- }
- int main(int argc, char *argv[])
- {
- int a[100];
- int length;
- cin>>length;
- for(int i=0;i<length;i++)
- cin>>a[i];
- cout<<k_element(a,0,length-1,4)<<endl;
- system("PAUSE");
- return EXIT_SUCCESS;
- }
- 求n个数中前K大的数
- void exchange(int &a,int &b)
- {
- int temp=a;
- a=b;
- b=temp;
- }
- int partition(int *a,int l,int r)
- {
- int i=l-1;
- int j=l;
- int x=a[r];
- for(j=l;j<r;j++)
- {
- if(a[j]>=x)
- {
- exchange(a[i+1],a[j]);
- i++;
- }
- }
- exchange(a[i+1],a[r]);
- return i+1;
- }
- void getKMax(int *a,int l,int r,int k)
- {
- if(l>=r)
- return;
- int q=partition(a,l,r);
- if(q==k-1)
- return;
- else if(q>=k)
- return getKMax(a,l,q-1,k);
- else
- return getKMax(a,q+1,r,k-(q+1));
- }
- int* findTopK(int *a,int n,int k)
- {
- int *result = new int[k];
- getKMax(a,0,n-1,k);
- for(int i=0;i<k;i++)
- cout<<a[i]<<" ";
- cout<<endl;
- for(int i=0;i<k;i++)
- result[i]=a[i];
- return result;
- }
- 快速排序
- #include <cstdlib>
- #include <iostream>
- using namespace std;
- int partition(int num[],int p,int r)
- {
- int i=p-1;
- int j;
- int x=num[r];
- int temp;
- for(j=p;j<r;j++)
- {
- if(num[j]<x)
- {
- temp=num[j];
- num[j]=num[i+1];
- num[i+1]=temp;
- i++;
- }
- }
- temp=num[r];
- num[r]=num[i+1];
- num[i+1]=temp;
- return i+1;
- }
- void quick_sort(int num[],int p,int r)
- {
- if(p>=r)
- return;
- int q=partition(num,p,r);
- quick_sort(num,p,q-1);
- quick_sort(num,q+1,r);
- }
- int main(int argc, char *argv[])
- {
- int num[100];
- int length;
- int i;
- cin>>length;
- for(i=0;i<length;i++)
- cin>>num[i];
- quick_sort(num,0,length-1);
- for(i=0;i<length;i++)
- cout<<num[i]<<" ";
- cout<<endl;
- system("PAUSE");
- return EXIT_SUCCESS;
- }
0 0
- 求n个数中第k大的数、前K大的数、快速排序
- 求n个数中第k大的数、快速排序
- 用快速排序的思想求第K大的数或最大的k个数
- 第K小的数 快速排序 选择前K大O(n)
- 面试题: 求N个数中前k个大的数(大数据)
- 查找N个数中第K大的数
- 查找N个数中第K大的数
- 求一个数组中前K大的数或者第K大的数
- BFPTR算法(中位数的中位数算法)求n个数中第k大的数
- 分治算法求N个数中第K小(大)的数
- POJ 1442 Black Box 优先队列 求前a[k]个数中第k大的数
- C#求数组中前K大的数
- C++实现求数组中前K大的数
- 快速选择(quick select) + 线性时间选择(linear-time select) - 求出n个数中第k大的数
- 快速选择(quick select) + 线性时间选择(linear-time select) - 求出n个数中第k大的数
- 第k大的数(快速排序的划分过程)
- 由快速排序引出的第k大的数..
- 求第K大的数~~
- void及void指针含义的深刻解析
- Counting bobs
- oracle basic compress
- Object -C 2.0基础语法
- Ruby on Rails 时间加上N天
- 求n个数中第k大的数、前K大的数、快速排序
- NGUI 鼠标停留UI上时缓慢显示子Item,当无停留超过一定时间后回到原地
- AJax和comet
- Java HashMap的工作原理
- android-Activity操作Data文件
- tabbar 按钮形状自定义显示问题
- 关于Binary Search的写法总结
- maven教程(一)配置环境
- uva 10892 - LCM Cardinality(数论)