编写程序,完成下列功能:
(1)输入 20 个整数到数组中;
(2)对 20 个数按从大到小的顺序排序,输出排序后的数组;
(3)输入一个整数 x;
(4)在数组中,用二分法查找 x。如果找到了输出 x 在数组中的下标,找不到输出-1。
package labreport4;
import java.util.Scanner;
public class work4_4 {
//输出数组
static void display(int a[]) {
for(int i=0;i<a.length;i++) {
System.out.print(a[i]+" ");
}
System.out.println("");
}
//冒泡法排序
static void order(int a[]) {
int i,j,temp;
for(i=0;i<a.length;i++) {
for(j=0;j<i;j++) {
if(a[j]<a[i]) {
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
}
}
//二分法查找
static int binarySearch(int a[], int x) {
int left = 0;//查找范围上限
int right= a.length-1;//查找范围下限
while (left <= right) {
int mid = (left + right) / 2;//取查找范围中间的数
if (x > a[mid])//比中间的数大,x不在右半部分
right = mid - 1;//查找范围下限移到中间的左边
else if (x < a[mid])//比中间的数小,x不在左半部分
left = mid + 1;//查找范围上限移到中间的右边
else //x==a[mid],找到了
return mid;
}
return -1; //找不到
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int a[]=new int[5];
int j=0;
Scanner input=new Scanner(System.in);
for(j=0;j<a.length;j++) {
a[j]=input.nextInt();
}
int i=input.nextInt();//输入要查找的数
order(a);//从大到小排序
display(a);//输出
int b=binarySearch(a,i);//二分查找
System.out.println(b);//输出查找结果
}
}
二分查找是重点,首先确定查找的上下限,然后用中间下标数据与被找数作比较,如果中间下标数据较大,则最大下标等于中间下标-1;中间下标数据较小,则最小下标等于中间下标+1。直至两数相等,则返回中间下标。如若最小下标 > 最大下标,说明数据不存在,则返回-1。