1. 程式人生 > 實用技巧 >六、查詢演算法

六、查詢演算法

1、線性查詢法

根據下標值依次挨個查詢(順序查詢),找到了就返回

程式碼實現:

package com.search.find;

public class LineFind {
    public static void main(String[] args) {
        int[] arr = {1, 3, 6, 4, 44, 11};
        int index = find(arr, 11);
        if (index == -1) {
            System.out.println("沒有找到");
        } else {
            System.out.println(
"下標為:" + index); } } public static int find(int[] arr, int target) { for (int i = 0; i < arr.length; i++) { if (arr[i] == target) { return i; } } return -1; } }

2、二分查詢法

二分查詢法的前提是,查詢的資料是有序的。

程式碼實現:

package com.search.find;

import java.util.*; public class BinaryFind { public static void main(String[] args) { //測試simpleFind int[] arr = {1, 3, 4, 5, 7, 9, 15}; System.out.println("4下標是:" + simpleFind(arr, 0, arr.length - 1, 4)); System.out.println("****************************");
int[] multiArr = {1, 5, 7, 12, 12, 12, 12, 54}; System.out.println("12下標是:" + multiFind(multiArr, 0, multiArr.length - 1, 12)); } public static int simpleFind(int[] arr, int left, int right, int target) {//查詢的數值是唯一的 int mid = (left + right) / 2;//二分中間值的下標 int midVal = arr[mid];//二分中間值 if (left > right) {//沒有找到目標值 return -1; } if (midVal > target) { return simpleFind(arr, left, mid - 1, target); } else if (midVal < target) { return simpleFind(arr, mid + 1, right, target); } else { return mid; } } public static List<Integer> multiFind(int[] arr, int left, int right, int target) {//查詢的陣列是不是唯一的 int mid = (left + right) / 2;//二分中間值的下標 int midVal = arr[mid];//二分中間值 if (left > right) { return null; } if (midVal > target) { return multiFind(arr, left, mid - 1, target); } else if (midVal < target) { return multiFind(arr, mid + 1, right, target); } else { List<Integer> list = new ArrayList<>(); mid = mid - 1; while (arr[mid] == target && mid >= 0) { list.add(mid); mid = mid - 1; } mid = mid + 1; while (arr[mid] == target && mid < arr.length) { list.add(mid); mid = mid + 1; } return list; } } } 輸出結果列印: 4下標是:2 **************************** 12下標是:[3, 4, 5, 6]