题目描述
有n个数(n<=1000000),这n个数已按从大到小顺序存放在一个数组中,然后有T次查询,每次输入一个数,要求用折半查找法找出该数在数组中第一次出现的位置。如果不在数组中输出0。
输入
第一行数组元素的个数n
第二行n个数组元素的值
第三行输入查询次数T (T<=100000)往下有T行,每行输入一个需要查询的数字
输出
查找的值在数组中的位置
样例输入
10 10 9 8 7 6 5 4 3 2 1 2 9 5
样例输出
2 6
提示
注意:数组空间为1000000和100000
#include<stdio.h>
int n,i,j,k,index,array[1000001],key;
int binary_search(int array[],int n,int key)
{
int index=-1,left=0,right=n-1,mid;
while(left<=right)
{
mid=left+(right-left)/2;
if(key<array[mid])
left=mid+1;
//此思路为划分区间,如果查找的key在右区间,就在右区间二分;
//如果查找的数在左区间,或者要查找的数正好就是mid(考虑到mid可能不是第一个)
//但是不论如何都对左区间多次二分查找
//不能用for循环查找,会超时20%!!!!
else
{
if(key==array[mid])
{
index=mid;
}
right=mid-1;
}
}
return index+1;
}
int main()
{
scanf("%d",&n);
for(i=0; i<n; i++)
scanf("%d",&array[i]);
scanf("%d",&k);
while(k--)
{
scanf("%d",&key);
index=binary_search(array,n,key);
if(index>=0)
printf("%d\n",index);
}
}
inline char gc()
{
static char buff[100000000],*S=buff,*T=buff;
return S==T&&(T=(S=buff)+fread(buff,1,100000000,stdin),S==T)?EOF:*S++;
}
#include<stdio.h>
int n,i,j,k,index,array[1000001],key;
int binary_search(int array[],int n,int key)
{
int index=-1,left=0,right=n-1,mid;
while(left<=right)
{
mid=left+(right-left)/2;
if(key==array[mid])
{//此方法是进行判断
//如果中间的数和前一个数相同,因为是从大到小排的,说明在mid处的key在key之前已经
//出现过了,此时对从开始到mid-1再次二分查找
if(array[mid]==array[mid-1])
right=mid-1;
//如果和前一个数不相等,说明在mid处的key就是要找到第一个了,不需要二分了,标记位置然后break
else
{
index=mid;
break;
}
}
else if(key<array[mid])
left=mid+1;
else
right=mid-1;
}
return index+1;
}
int main()
{
scanf("%d",&n);
for(i=0; i<n; i++)
scanf("%d",&array[i]);
scanf("%d",&k);
while(k--)
{
scanf("%d",&key);
index=binary_search(array,n,key);
if(index>=0)
printf("%d\n",index);
}
}
inline char gc()
{
static char buff[100000000],*S=buff,*T=buff;
return S==T&&(T=(S=buff)+fread(buff,1,100000000,stdin),S==T)?EOF:*S++;
}
3330: 排序排序排序
题目描述
有n个数,要你从小到大进行输出排序
输入
n(0<n<=100005)
然后是n个整数输出
输出n个数从小到大的顺序
样例输入
copy5 1 2 5 1 2样例输出
1 1 2 2 5
#include<stdio.h>
#include<iostream>
using namespace std;
int a[100005];
void quicksort(int left,int right)
{
if(left>=right)
return;
int i=left,j=right,temp=a[left];
while(i!=j)
{
while(a[j]>=temp&&i<j)
j--;
while(a[i]<=temp&&i<j)
i++;
if(i<j)
swap(a[i],a[j]);
}
a[left]=a[i];
a[i]=temp;
quicksort(i+1,right);
quicksort(left,j-1);
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
quicksort(1,n);
for(int i=1;i<=n;i++)
printf("%d\n",a[i]);
}