package com.itheima;
public class Test018
{
/**
* 查找一个元素在数组中出现的位置
* 普通查找:遍历数组,将要查找的值与数组的每个元素进行比较。
* 折半查找:首先数组是有序的(升序)。MIN = 0, MAX = arr.length -1, MID = (MIN + MID)/2;
* 先将数组的中间位置元素比较(key == arr[MID])
* 如果key>arr[MID],MIN = MID+1
* 如果key<arr[MID],MAX = MID-1;
* 再将数组的中间位置元素比较(key == arr[MID])
* 如果找到 该元素的下角标是MID,如果MIN>MAZ还没找到,则key不在数组中
*
* @param args
*/
public static void main(String[] args)
{
int[] arr = new int[]{52, 68, 45, 0, 12, 58, 71, 35, 95, 46};
Test017.printArr(arr);
int key = 69;
int index = getIndex(arr, key);
System.out.println(key +"的位置是:" + index);
//对数组进行排序
Test017.setAscending_2(arr);
Test017.printArr(arr);
index = halfSearch(arr, key);
System.out.println(key +"的位置是:" + index);
}
//获取元素出现的位置,如果有,返回下角标,如果没有,返回-1
public static int getIndex(int[] arr, int key)
{
for(int i = 0; i < arr.length; i++)
{
if(arr[i] == key)
return i;
}
return -1;
}
//折半查找(如果找到,返回元素的下角标,如果找不到返回一个位置,使key插入到数组中,数组仍是有序的)
public static int halfSearch(int[] arr, int key)
{
int max = arr.length -1, min = 0, mid = 0;
for(int i = 0; min <= max; i++)
{
mid = (max + min)/2;
if(key > arr[mid])
{
min = mid + 1;
}
else if(key < arr[mid])
{
max = mid - 1;
}
else
return mid; //返回元素的下角标
}
return min; //返回插入的位置
}
}
|
|