求n个数中第k大的数、前K大的数、快速排序

来源:互联网 发布:nginx 缓存静态文件 编辑:程序博客网 时间:2024/04/30 13:49
  • 求n个数中第k大的数

[cpp] view plaincopy
  1. #include <cstdlib>  
  2. #include <iostream>  
  3. /** 
  4.  *求一个数组中的第k大数 
  5.  *基本思想: 
  6.  *以最后一个元素x为轴,把数组分为两部分Sa和Sb。Sa中的元素大于等于X,Sb中元素小于X。这时有两种情况: 
  7.  *1.Sa中元素的个数小于k,则Sb中的第k-|Sa|个元素即为第k大数; 
  8.  *2.Sa中元素的个数大于等于k,则返回Sa中的第k大数。 
  9.  *时间复杂度近似为O(n)  
  10.  */  
  11. using namespace std;  
  12. void exchange(int &a,int &b)  
  13. {  
  14.     int temp;  
  15.     temp=a;  
  16.     a=b;  
  17.     b=temp;  
  18. }  
  19. //快排的partition函数   
  20. int partition(int *a,int l,int r)  
  21. {  
  22.     int i=l-1,j=l;  
  23.     int x=a[r];  
  24.     int temp;  
  25.       
  26.     for(j=l;j<r;j++)  
  27.     {  
  28.         if(a[j]>=x) //把比x大的数往前放       
  29.         {  
  30.             exchange(a[j],a[i+1]);  
  31.             i++;          
  32.         }          
  33.     }  
  34.     exchange(a[r],a[i+1]);  
  35.     return i+1;          
  36. }  
  37. int k_element(int *a,int l,int r, int k)  
  38. {  
  39.     if(l>=r)  
  40.         return a[l];  
  41.     int q=partition(a,l,r);  
  42.     if(q==k-1)  
  43.         return a[q];     
  44.     else if(q>=k)  
  45.         return k_element(a,l,q-1,k); //Sa中元素个数大于等于k     
  46.     else  
  47.         return k_element(a,q+1,r,k-(q+1)); //Sa中元素个数小于k      
  48. }  
  49. int main(int argc, char *argv[])  
  50. {  
  51.     int a[100];  
  52.     int length;      
  53.     cin>>length;      
  54.     for(int i=0;i<length;i++)  
  55.         cin>>a[i];  
  56.     cout<<k_element(a,0,length-1,4)<<endl;  
  57.       
  58.     system("PAUSE");  
  59.     return EXIT_SUCCESS;  
  60. }  
 

 

  •  求n个数中前K大的数
[cpp] view plaincopy
  1. void exchange(int &a,int &b)  
  2. {  
  3.     int temp=a;  
  4.     a=b;  
  5.     b=temp;      
  6. }  
  7. int partition(int *a,int l,int r)  
  8. {  
  9.     int i=l-1;  
  10.     int j=l;  
  11.     int x=a[r];  
  12.     for(j=l;j<r;j++)  
  13.     {  
  14.         if(a[j]>=x)  
  15.         {  
  16.             exchange(a[i+1],a[j]);  
  17.             i++;          
  18.         }      
  19.     }  
  20.     exchange(a[i+1],a[r]);  
  21.     return i+1;      
  22. }   
  23.   
  24. void getKMax(int *a,int l,int r,int k)  
  25. {  
  26.     if(l>=r)  
  27.         return;  
  28.     int q=partition(a,l,r);  
  29.     if(q==k-1)  
  30.         return;  
  31.     else if(q>=k)  
  32.         return getKMax(a,l,q-1,k);  
  33.     else  
  34.         return getKMax(a,q+1,r,k-(q+1));      
  35. }  
  36. int* findTopK(int *a,int n,int k)  
  37. {  
  38.     int *result = new int[k];  
  39.     getKMax(a,0,n-1,k);  
  40.     for(int i=0;i<k;i++)  
  41.         cout<<a[i]<<" ";  
  42.     cout<<endl;  
  43.     for(int i=0;i<k;i++)  
  44.         result[i]=a[i];  
  45.     return result;          
  46. }  


  • 快速排序

[cpp] view plaincopy
  1. #include <cstdlib>  
  2. #include <iostream>  
  3. using namespace std;  
  4. int partition(int num[],int p,int r)  
  5. {  
  6.     int i=p-1;  
  7.     int j;  
  8.     int x=num[r];  
  9.     int temp;  
  10.       
  11.     for(j=p;j<r;j++)  
  12.     {  
  13.         if(num[j]<x)  
  14.         {  
  15.             temp=num[j];  
  16.             num[j]=num[i+1];  
  17.             num[i+1]=temp;  
  18.             i++;                 
  19.         }        
  20.     }  
  21.     temp=num[r];  
  22.     num[r]=num[i+1];  
  23.     num[i+1]=temp;  
  24.     return i+1;         
  25. }  
  26. void quick_sort(int num[],int p,int r)  
  27. {  
  28.     if(p>=r)   
  29.         return;  
  30.     int q=partition(num,p,r);  
  31.     quick_sort(num,p,q-1);  
  32.     quick_sort(num,q+1,r);         
  33. }  
  34. int main(int argc, char *argv[])  
  35. {  
  36.     int num[100];  
  37.     int length;  
  38.     int i;      
  39.     cin>>length;  
  40.     for(i=0;i<length;i++)  
  41.         cin>>num[i];      
  42.     quick_sort(num,0,length-1);  
  43.     for(i=0;i<length;i++)  
  44.         cout<<num[i]<<" ";      
  45.     cout<<endl;  
  46.     system("PAUSE");  
  47.     return EXIT_SUCCESS;  
  48. }

0 0