爱嘉牛LA

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

1.求给定一乱序数据,找出第k小的数据

View Code
 1 #include<iostream>
 2 #include<stdlib.h>
 3 using namespace std;
 4 
 5 template<class Type>
 6 void Swap(Type *a,Type *b){
 7     Type temp;
 8     temp=*a;
 9     *a=*b;
10     *a=temp;
11 }
12 template<class Type>
13 Type select(Type a[],int L,int R,int k){    
14     //计算a[L:R]中第K小元素
15     while(true){
16         if(L>=R) return a[L];
17         int i=L,
18             j=L+rand()%(R-L+1);//随机选择的划分基准
19         //k=k-j+L-1;
20         cout<<"基准:"<<j<<endl;
21 
22         //二分法找出第K小的元素
23         Swap(&a[i],&a[j]);
24         j=R+1;
25         Type privot=a[L];
26         //以划分基准为轴做元素交换
27 
28         while(true){
29             while(a[++i]<privot);//把                                                                                                                                                                                                                                                                                                                                                                                                                    小于划分标准的数放在左边
30             while(a[--j]>privot);//把大于划分标准的数放在右边
31             if(i>=j) break;
32             Swap(&a[i],&a[j]);
33         }
34         if (j-L+1==k)
35            return privot;
36         a[L]=a[j];
37         a[j]=privot;
38         //对子数组重复划分过程
39         if (j-L+1<k)
40         {
41             k=k-j+L-1;
42             L=j+1;
43         }
44         else
45             R=j-1;
46 
47     }
48 }
49 template<class Type>
50 Type Select(Type a[],int n,int k){
51     //计算a[1:n-1]中第K小元素
52     //假设a[n]是一个键值无穷大的元素
53     if (k<1||k>n){
54         cout<<"无解...."<<endl;
55         return 0;
56     }
57     return select(a,0,n-1,k);
58 }
59 
60 int main()
61 {
62     int a[100],n,k;
63     cout<<"请输入数组的个数:";cin>>n;
64     cout<<"您要查找的是第几小的数:";cin>>k;
65     cout<<"请输入输入元素"<<endl;
66     for (int i=0;i<n;i++)
67     {
68         cin>>a[i];
69     }
70     cout<<""<<k<<"小的元素:"<<Select(a,n,k)<<endl;
71     system("pause");
72     return 0;
73 }

2.求给定一乱序数组,找出排序后第k个位置上的数据(这个跟上面的区别是:例如:5,5,5,5,5  用上面程序求解第3小

   是无解的,用2程序求解,解为5)

View Code
 1 #include<iostream> 
 2 using namespace std;
 3 template<class T>
 4 void Swap(T *a,T *b){
 5     T temp;
 6     temp=*a;
 7     *a=*b;
 8     *b=temp;
 9 }
10 template<class T>
11 void select(T a[],int L,int R,int k){
12     int F=L,E=R;
13 
14     while(true){
15         //k=k-1;
16         int i=F,j=E;        
17         int stand=F+rand()%(E-F+1);
18         if(F==E&F==k-F+1){
19             cout<<""<<k<<"小值为:"<<a[stand];
20             break;
21         }
22          
23          //调试
24          //cout<<"F:"<<F<<"   E:"<<E<<endl;
25          //cout<<"stand:"<<stand<<endl;
26         
27         Swap(&a[i],&a[stand]);//把基准位置的元素与第一个元素交换
28             stand=i;//记录下基准元素次数所在位置 
29     
30         //调试
31         //cout<<"与第一个交换:"; 
32         //for(int fi=0;fi<=R;fi++)
33         //cout<<a[fi]<<"  ";
34         //cout<<endl;
35         
36         while(true){
37             while(a[j]>=a[stand]){//从后往前 
38                 j--;
39             }
40             if(i<j){
41                 //cout<<"j:"<<j<<endl;
42                 Swap(&a[j],&a[stand]);
43                 stand=j;
44                 
45                 /*
46 for(int fi=0;fi<=R;fi++)
47                    cout<<a[fi]<<"  ";
48                 cout<<endl;    */            
49             }
50             else
51               break;                
52             while(a[i]<=a[stand]){//从前往后 
53                 i++;
54             }
55             if(i<j){
56                 //cout<<"i:"<<i<<endl;
57                 Swap(&a[i],&a[stand]);
58                 stand=i;
59                 
60                /*
61  for(int fi=0;fi<=R;fi++)
62                    cout<<a[fi]<<"  ";
63                 cout<<endl;*/
64             }      
65             else
66               break;
67         }
68         //cout<<"交换之后stand:"<<stand<<endl; 
69         if(k==stand+1){
70             cout<<""<<k<<"小值为:"<<a[stand];
71             break;
72         }           
73         if(k>stand+1)
74            F=stand+1;
75         else
76            E=stand-1;
77                 
78     } 
79 }
80 int main()
81 {
82     int a[100],n,k;
83     cout<<"请输入数组的个数:";cin>>n;
84     cout<<"您要查找的是第几小的数:";cin>>k;
85     if(n<=0||k-1<0||k-1>n-1){
86         cout<<endl<<"无解..."<<endl;
87          return 0;
88     }
89     cout<<"请输入数组元素:";
90     for (int i=0;i<n;i++)
91     {
92         cin>>a[i];
93     }
94     select(a,0,n-1,k);
95     //cout<<"第"<<k<<"小的元素:"<<<<endl;
96     system("pause");
97     return 0;
98 }

 

 

posted on 2013-01-28 11:35  爱嘉牛LA  阅读(515)  评论(0)    收藏  举报