java之数组的查找问题

二分查找

数组与数据结构紧密相关,数组的常用操作有:排序、查找、搜索。

一、排序

冒泡排序和快速排序

二、查找

例子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);//将出现最多的这个数字打印出来
				}
		}
	}
}

部分结果截图:
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44830627/article/details/105343963