基础版
#include<stdio.h>
int main(){
int n,i;
scanf("%d",&n);
int ans[n];
for(i=0;i<n;i++){
scanf("%d",&ans[i]);
}
int j,m,target;
j=n-1;
i=0;
scanf("%d",&target);
while(i<=j){
m=(i+j)/2;
if(target==ans[m]){
printf("%d",m);
return 0;
}
if(target>ans[m]){
i=m+1;
}else{
j=m-1;
}
}
return -1;
}
import java.util.Scanner;
public class Main {
public static int main(String[] args) {
Scanner s=new Scanner(System.in);
int n;
n=s.nextInt();
int[] a=new int[n];
for(int i=0;i<n;i++) {
a[i]=s.nextInt();
}
int i=0,j=n-1,target,m;
target=s.nextInt();
while(i<=j) {
m=(i+j)/2;//(i+j)>>>1
if(a[m]==target) {
return m;
}
if(a[m]<target) {
i=m+1;
}else {
j=m-1;
}
}
return n;
}
}
改进版
import java.util.Scanner;
public class Main {
public static int main(String[] args) {
Scanner s=new Scanner(System.in);
int n;
n=s.nextInt();
int[] a=new int[n];
for(int i=0;i<n;i++) {
a[i]=s.nextInt();
}
int i=0,j=n,target,m;
target=s.nextInt();
while(i<j) {
m=(i+j)/2;//(i+j)>>>1
if(a[m]==target) {
return m;
}
if(a[m]<target) {
i=m+1;
}else {
j=m;
}
}
return n;
}
}
import java.util.Scanner;
public class Main {
public static int main(String[] args) {
Scanner s=new Scanner(System.in);
int n;
n=s.nextInt();
int[] a=new int[n];
for(int i=0;i<n;i++) {
a[i]=s.nextInt();
}
int i=0,j=n,target,m;
target=s.nextInt();
while(i<j) {
m=(i+j)/2;//(i+j)>>>1
if(a[m]==target) {
return m;
}
if(a[m]<target) {
i=m;
}else {
j=m;
}
}
return n;
}
}
重复目标求最左版
import java.util.Scanner;
public class Main {
public static int main(String[] args) {
Scanner s=new Scanner(System.in);
int n;
n=s.nextInt();
int[] a=new int[n];
for(int i=0;i<n;i++) {
a[i]=s.nextInt();
}
int i=0,j=n-1,target,m,candidate=-1;
target=s.nextInt();
while(i<=j) {
m=(i+j)>>>1;
if(a[m]<target) {
i=m+1;
}else if(a[m]>target) {
j=m-1;
} else{
//候选者
candidate=m;
j=m-1;//i=m+1
}
}
return candidate;
}
}