首页 > 代码库 > 快速排序+查找
快速排序+查找
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)//二分查找,未找到返回-130 {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)//二分下界查找,无下界返回-143 {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)//二分上届查找,无上届返回-155 {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 }
快速排序+查找
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。