10.3先修课

一、二分查找(二分答案)

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.堆排序

三、递归

猜你喜欢

转载自blog.csdn.net/weixin_43602607/article/details/108895388
今日推荐