1 #include <iostream>
2 #include <cstdio>
3 #include <cstring>
4 using namespace std;
5
6 const int maxn=10000;
7 int f[maxn];
8 void swap(int &a,int &b){int t=a;a=b;b=t;}
9
10 /*********************************************/
11 //所有l均为数组起始下标,所有r均为数组结束下标
12 void quicksort(int a[],int l,int r)//快速排序
13 {
14 if(l<r)
15 {
16 int t=a[l],i=l,j=r;
17 while(i!=j)
18 {
19 while(t<=a[j] && i<j) j--;
20 while(a[i]<=t && i<j) i++;
21 if(i<j) swap(a[i],a[j]);
22 }
23 a[l]=a[i];a[i]=t;
24 quicksort(a,l,i-1);
25 quicksort(a,i+1,r);
26 }
27 }
28
29 int binary_search(int a[],int l,int r,int val)//二分查找,未找到返回-1
30 {
31 int mid,ans=-1;
32 while(l<=r)
33 {
34 mid=(l+r)>>1;
35 if(val>a[mid]) l=mid+1;
36 else if(val==a[mid]) return mid;
37 else r=mid-1;
38 }
39 return ans;
40 }
41
42 int lower_bound(int a[],int l,int r,int val)//二分下界查找,无下界返回-1
43 {
44 int mid,ans=-1;
45 while(l<=r)
46 {
47 mid=(l+r)>>1;
48 if(a[mid]<=val) ans=mid,l=mid+1;
49 else r=mid-1;
50 }
51 return ans;
52 }
53
54 int upper_bound(int a[],int l,int r,int val)//二分上届查找,无上届返回-1
55 {
56 int mid,ans=-1;
57 while(l<=r)
58 {
59 mid=(l+r)>>1;
60 if(a[mid]>=val) ans=mid,r=mid-1;
61 else l=mid+1;
62 }
63 return ans;
64 }
65 /*********************************************/
66
67 int main()
68 {
69 int i,n;
70 while(~scanf("%d",&n))
71 {
72 for(i=1;i<=n;i++) scanf("%d",f+i);
73 quicksort(f,1,n);
74 for(i=1;i<=n;i++) printf("%d ",f[i]);
75 puts("");
76 int t,p;
77 puts("5次二分查找");t=5;
78 while(t--){scanf("%d",&p);printf("%d\n",binary_search(f,1,n,p));}
79 puts("5次二分下界查找");t=5;
80 while(t--){scanf("%d",&p);printf("%d\n",lower_bound(f,1,n,p));}
81 puts("5次二分上界查找");t=5;
82 while(t--){scanf("%d",&p);printf("%d\n",upper_bound(f,1,n,p));}
83 }
84 return 0;
85 }