二分模板
循环做法:
#include <bits/stdc++.h>
using namespace std;
int n;
int a[1000100];
int x,left1,right1,mid,ans=-1;
//ans代表要查找的数的下标
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];//输入数列
}
cin>>x;//输入要查找的值
left1=0;right1=n-1;
while(left1<=right1){
mid=(left1+right1)/2;//取中间
if(a[mid]==x){
ans=mid+1;//位置=下标+1
break;
}else if(a[mid]<x){
left1=mid+1;//找后面
}else if(a[mid]>x){
right1=mid-1;//找前面
}
}
cout<<ans<<endl;//输出结果
return 0;
}
递归做法:
#include <bits/stdc++.h>
using namespace std;
int a[1000100];
int n;
int x;
int inhalf(int left,int right){
if(left>right){
return -1;
}
int mid=(right+left)/2;
if(a[mid]==x){
return mid+1;
}else if(a[mid]<x){
return inhalf(mid+1,right);
}else if(a[mid]>x){
return inhalf(left,mid-1);
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
cin>>x;
cout<<inhalf(0,n-1)<<endl;
return 0;
}
冒泡排序(优化版)
#include <bits/stdc++.h>
using namespace std;
//程序设计:n个数,通过冒泡排序将他们排成由小到大的序列
int a[1000];
int f=false;//f判断是否有交换,即判断当前序列是否有序
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
//i表示轮数
for(int i=1;i<=n-1;i++){
//j表示下标 n-i-1为范围
f=false;
for(int j=0;j<=n-i-1;j++){
if(a[j]>a[j+1]){
swap(a[j],a[j+1]);
f=true;
}
}
if(!f){//防止有序还在执行
break;
}
}
for(int i=0;i<=n-1;i++){
cout<<a[i]<<" ";
}
return 0;
}