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

来源:互联网 发布:uart数据帧格式 编辑:程序博客网 时间:2024/04/30 09:00

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

分类: 数据结构和算法 41人阅读 评论(0)收藏 举报
  • 求n个数中第k大的数
view plain
  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. }  
 

 

 

  • 快速排序
view plain
  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;  


原创粉丝点击