文章目录
- 一、二分查找(二分答案)
- 二、排序
- 三、递归
一、二分查找(二分答案)
1.问题引入
有n个升序正整数ai,有q个询问,每次输入一个x,
求小于等于x的最大值,(数据保证有数比x小)
例如:1 3 4 6 7 9 , x=5,x=6
下标:1 2 3 4 5 6
有个游戏叫猜数字,有一个数a,属于【1,1000】
每次猜一个数x,会告诉你x跟a比,大了还是小了
我们令str=1,end=n,求mid=(str+end)/2
这样区间就变成了三部分:[str,mid-1],mid,[mid+1,end]
代码实现:
int main(){
int n,q,x;
cin>>n>>q;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=q;i++){
cin>>x;
int str=1,end=n,mid,ans=0;
while(str<=end){
mid=(str+end)/2;
if(a[mid]<x){
str=mid+1;
ans=mid;
}
else if(a[mid]>x)end=mid-1;
else {
ans=mid;
break;
}
}
cout<<a[ans]<<endl;
}
return 0;
}
例题1
例题2
例题3
例题4
二、排序
给定n个数,每个数分别为ai,对a[]数组排个升序,并输出
例:3 2 9 5 7 8 4 1 6 =>1 2 3 4 5 6 7 8 9
1.冒泡排序
让相邻两个数,比较,如果前面一个数较大,就交换
3 2 9 5 7 8 4 1 6
2 3 9 5 7 8 4 1 6
2 3 9 5 7 8 4 1 6
2 3 5 9 7 8 4 1 6
2 3 5 7 9 8 4 1 6
2 3 5 7 8 9 4 1 6
2 3 4 7 8 4 9 1 6
2 3 4 7 8 4 1 9 6
2 3 4 7 8 4 1 6 9
2.sort(快速排序)
3.桶排序
数组有对应的下标,比如a[i]中的i
我们令a[i]的值表示所有数中有多少个i
例如:1 1 4 5 7 3 2 2 2
a[1]=2,a[2]=3,a[3]=1,a[4]=1,a[5]=1,a[6]=0,a[7]=1
4.归并排序
5.堆排序