二分查找
数组与数据结构紧密相关,数组的常用操作有:排序、查找、搜索。
一、排序
二、查找
例子1、查找数组中的某个数,如果查到这个数就返回其下标,没遇到就返回-1
import java.util.Scanner;
public class Demo1Array {
public static void main(String[] args) {
// TODO Auto-generated method stub
int []arr={8,7,5,3,6,8,88,4,8,8};
Scanner scanner=new Scanner(System.in);
int a=scanner.nextInt();
int index=SearchArray(a,arr);
System.out.println(index);
}
private static int SearchArray(int a, int[] arr) {
// TODO Auto-generated method stub
for (int i = 0; i < arr.length; i++) {
if(a==arr[i]) {
System.out.println(i);
}
}
return -1;
}
}
输出结果:
【说明】这个数组的效率比较低,如果数组中有大量的数据,这样遍历数组代价很高不适用。
二分查找
二分查找(Binary Search):前提必须是待查找的数组要有序。要么是升序,要么是降序。(和快速排序很像)
import java.util.Scanner;
/**
*
* @author xinbai 2020-4-10,下午8:34:27
*/
public class Demo1Array {
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
int index = SearchArray(a, arr);
System.out.println(index);
}
private static int SearchArray(int a, int[] arr) {
// TODO Auto-generated method stub
int high = arr.length - 1;
int low = 0;
int middle;
while (low <= high) {
middle = (low + high) / 2;
if (arr[middle] == a) {
return middle;
}
if (a <arr[middle]) {
high = middle - 1;
}
if (a > arr[middle]) {
low = middle + 1;
}
}
return -1;
}
}
看一下过程:
import java.util.Scanner;
/**
*
* @author xinbai 2020-4-10,下午8:34:27
*/
public class Demo1Array {
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
int index = SearchArray(a, arr);
System.out.println(index);
}
private static int SearchArray(int a, int[] arr) {
// TODO Auto-generated method stub
int high = arr.length - 1;
int low = 0;
int middle;
while (low <= high) {
middle = (low + high) / 2;
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]);
if (i==middle) {
System.out.print("#");
}
System.out.print(" ");
}
System.out.println();
if (arr[middle] == a) {
return middle;
}
if (a <arr[middle]) {
high = middle - 1;
}
if (a > arr[middle]) {
low = middle + 1;
}
}
return -1;
}
}
【说明】:先找出中间值,数组的长度为奇偶对比较没有影响,若奇数取中间值,若偶数取中间两个数任意一个都可以。大于中间数就middle + 1往右边找,找到就返回这个middle,小于中间数就middle ±1往左边找,找到就返回这个middle。
题目二: 随机生成 50 个数字(整数),每个数字的范围是[10, 50],统计每个数字出现的次数以及出现次数最多的数字与它的个数,最后将每个数字及其出现次数打印出来,如果某个数字出现次数为 0,则不要打印它。打印时按照数字的升序排列。
步骤一:随机生成 50 个数字(整数),每个数字的范围是[10,50]
随机数有java.util包下的Random类,还有java.lang.Math类下的Random()方法。
import java.util.Random;
/**
*
* @author xinbai 2020-4-10,下午9:01:06
*/
public class Demo1Array {
public static void main(String[] args) {
Random random = new Random();
for (int i = 0; i < 50; i++) {
int a=random.nextInt(41)+10;
System.out.println(a);
}
}
}
或
/**
*
* @author xinbai 2020-4-10,下午9:01:06
*/
public class Demo1Array {
public static void main(String[] args) {
for (int i = 0; i <50; i++) {
double result=Math.random();
result=result*41;
int result1=(int)result;
result1=result1+10;
System.out.println(result1);
}
}
}
整个程序:
import java.util.Random;
/**
*
* @author xinbai
* 2020-4-10,下午9:54:07
*/
public class Demo1Array {
public static void main(String[] args) {
Random random = new Random();
int []count=new int [41];//[10,50]有41个数,通过数组的值与索引来实现这个需求
for (int i = 0; i < 50; i++) {
int a=random.nextInt(41)+10;
System.out.println(a);
count[a-10]++;
}
for (int j = 0; j < count.length; j++) {
if (0==count[j]) {
continue;//如果出现0就不打印
}
System.out.println((10+j)+"appear number"+count[j]);
}
int max=count[0];
for (int i = 0; i < count.length; i++) {
if (max<count[i]) {
max=count[i];//统计出现最多的数字与它的个数
}
}
System.out.println("appear the max time"+max);
for (int j = 0; j < count.length; j++) {
if (max==count[j]) {
System.out.println(j+10);//将出现最多的这个数字打印出来
}
}
}
}
部分结果截图: