本帖最后由 sunriselzz 于 2013-6-28 22:29 编辑
这是我个人总结的折半查找的几个不同方式,包括折半查找的优化,
以及调用数组工具类Arrays的二分查找方法直接进行二分查找,
顺序查找,遍历等. 有不足的地方,欢迎分享指正,谢谢!
- import java.util.Arrays;
- public class ArraysSearch {
- /**
- * 数组常见操作:
-
- 查找: 顺序查找 折半查找
-
- * @param args
- */
- public static void main(String[] args) {
- //数组的定义及初始化
- int[] arr = new int[]{0,11,23,34,42,55,63,78,88,90};
- //增强for循环遍历数组
- printArr1(arr);
-
- System.out.println("\n 查找数组中的某个元素: ");
- //顺序查找
- int index1 = getIndex(arr,63);
- findElement(index1);
- //折半查找1
- int index3 = binarySearch(arr,63);
- findElement(index3);
- //折半查找2
- int index2 = halfSearch(arr,63);
- findElement(index2);
- //折半查找3
- int index4 = Arrays.binarySearch(arr, 77);
- //如果元素不存在,返回这个元素负的插入位置再-1
- findElement(index4);
-
- }
-
- //折半查找1
- public static int binarySearch(int[] arr, int key) {
- int min,max,mid;
- min = 0;
- max = arr.length-1;
- mid = (min+max)/2;
-
- while(key != arr[mid]){
- if(key < arr[mid]){
- max = mid - 1;
- }else{
- min = mid + 1;
- }
-
- if(max < min){
- return -1;
- }
- mid = (min+max)/2;
- }
- return mid;
- }
- //打印所要查找元素的结果
- public static void findElement(int index){
- if(-1 != index){
- System.out.println(" 所要查找元素在数组中的下标为: "+index);
- }else{
- System.out.println(" 数组中不存在该元素! ");
- }
- }
-
- //对排序后的元素进行折半查找的优化2
- public static int halfSearch(int[] arr,int key) {
- int low = 0;
- int high = arr.length-1;
- int mid;
-
- while(low <= high){
- mid = (low+high)>>1;
- if(key > arr[mid]){
- low = mid + 1;
- }else if(key < arr[mid]){
- high = mid - 1;
- }else{
- return mid;
- }
- }
- return -1; //若返回min,则可以获得往这个有序的数组中新存入一个元素,
- //并依然保持这个数组有序的下标
- }
- //查找数组中的元素
- public static int getIndex(int[] arr, int key) {
- for (int i = 0; i < arr.length; i++) {
- if(key == arr[i]){
- return i;
- }
- }
- return -1;
- }
-
- //普通for循环遍历数组arr
- public static void printArr2(int[] arr) {
- System.out.print(" 普通for循环遍历数组: { ");
- for (int i = 0; i < arr.length; i++) {
- if(i != arr.length-1){
- System.out.print(arr[i]+",");
- }else{
- System.out.println(arr[i]+" }");
- }
- }
- }
- //增强for循环遍历数组arr
- public static void printArr1(int[] arr) {
- System.out.print(" 增强for循环遍历数组: { ");
- for(int x : arr){
- System.out.print(x+" ");
- }
- System.out.println("}");
- }
- }
复制代码 |
|