Java学习_HalfSearch
折半查找的设计与原理
折半查找的原理:
定义三个角标变量为别为最小值min,最大值max,中间值mid;
第一次查找时使用中间值与目标值key进行比较;
mid = (max + min)/2;
如果arr[mid] = key,则找到目标;
否则在while循环里进行比较,直到比较超出实际意义;
如果中间值mid大于目标值key,则说明目标值在前一半数组中;
则令最大值为mid-1;
如果中间值mid小于目标值key,则说明目标值在数组的后一半中;
则令最小值为mid+1;
在比较这两种情况后应检测比较是否具有意义,即检测min是否还小于max;
如果min小于max仍然有意义,但如果min大于max,则比较无意义,应停止查找,告知系统查无此数!
/*
目的:练习使用数组的查找,熟练掌握数组的各种操作方式;
需求:设计一个查找函数,找出数组中特定的元素;
思路;使用随机函数获取一组数字,设计一个排序函数,将数组排序,将排序后的数组使用折半查找方式进行遍历比较;
步骤:利用随机函数生成一个数组;
设计一个排序函数(选择排序或者冒泡排序)将随机数组进行排序;
设计一个折半查找函数找出目标值;
*/
import java.util.Scanner;
class HalfSearch
{
public static void main(String[] args)
{
int n;
System.out.print("请输入数组的长度:");
n = inputInt();//整数输入器
int[] arr = new int[n];
arr = productArray(n);//数组生成器
printArray(arr);
newline(1);//换行器
System.out.println("排序后的数组为:");
Sort(arr);//排序
printArray(arr);
newline(1);
int key = 321;
int x = findSearch(arr,key);
if(x != -1)
System.out.println("数组的位置为:"+x);
else
System.out.println("该元素不存在!!!");
}
//整数输入器
public static int inputInt()
{
Scanner in = new Scanner(System.in);
int x = in.nextInt();
in.close();
return x;
}
//数组生成器
public static int[] productArray(int n)
{
int[] arr = new int[n];
for (int x = 0;x < n ;x++ )
{
arr[x] = (int)(Math.random()*1000);
}
return arr;
}
//数组输出器
public static void printArray(int[] arr)
{
System.out.print("[ ");
for (int x = 0;x < arr.length ;x++ )
{
if(x < arr.length-1)
System.out.print(arr[x]+" ");
else
System.out.print(arr[x]+" ]");
}
}
//设计排序函数
public static void Sort(int[] arr)
{
for (int x = 0;x<arr.length-1 ;x++ )
{
for (int y = 0;y<arr.length-x-1 ;y++ )
{
if(arr[y] > arr[y+1])
{
int temp = arr[y];
arr[y] = arr[y+1];
arr[y+1] = temp;
}
}
}
}
//折半查找函数
public static int findSearch(int[] arr,int key)
{
int min ,max , mid;
min = 0;
max = arr.length-1;
mid = (min + max)/2;
while (arr[mid] != key)
{
if(key > arr[mid])
min = mid + 1;
else if (key < arr[mid])
max = mid - 1;
if(min > max)
return -1;
mid = (min + max)/2;
}
return mid;
}
//换行器
public static void newline(int x)
{
while(x >=1)
{
System.out.println();
x--;
}
}
}
/*
运行结果:
请输入数组的长度:20
[ 894 551 266 117 367 74 549 285 7 214 471 773 832 866 625 34 110 860 472 886 ]
排序后的数组为:
[ 7 34 74 110 117 214 266 285 367 471 472 549 551 625 773 832 860 866 886 894 ]
该元素不存在!!!
*/