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 }


浙公网安备 33010602011771号