IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 算法:二分查找、插值查找、斐波那契查找 -> 正文阅读

[数据结构与算法]算法:二分查找、插值查找、斐波那契查找

?


public class 二分查找 {
    public static void main(String[] args) {
        int[] arr = {4, 9, 12, 16, 16, 16, 16, 16, 20, 33, 34, 56, 77};
//        ArrayList<Integer> list = binarySearch3(arr, 16, 0, arr.length - 1);
//        System.out.println(list);
        int i = binarySearch2(arr, 16, 0, arr.length - 1);
        System.out.println(i);
    }

    public static int binarySearch(int[] arr, int findVal, int start, int end) {
        if (start <= end) {
            int midIndex = (start + end) / 2;
            int mid = arr[midIndex];
            if (findVal < mid) {
                return binarySearch(arr, findVal, start, midIndex - 1);
            } else if (findVal > mid) {
                return binarySearch(arr, findVal, midIndex + 1, end);
            } else if (findVal == mid) {
                return midIndex;
            }
        }
        return -1;
    }

    public static int binarySearch2(int[] arr, int findVal, int start, int end) {
        while (start <= end) {
            int midIndex = (start + end) / 2;
            int mid = arr[midIndex];
            if (findVal < mid) {
                end = mid - 1;
            } else if (findVal > mid) {
                start = mid + 1;
            } else if (findVal == mid) {
                return midIndex;
            }
        }
        return -1;
    }

    public static ArrayList<Integer> binarySearch3(int[] arr, int findVal, int start, int end) {
        if (start <= end) {
            int midIndex = (start + end) / 2;
            int mid = arr[midIndex];
            if (start > end) {
                System.out.println("没有找到");
                return new ArrayList<Integer>();
            }
            if (findVal < mid) {
                return binarySearch3(arr, findVal, start, midIndex - 1);
            } else if (findVal > mid) {
                return binarySearch3(arr, findVal, midIndex + 1, end);
            } else if (findVal == mid) {
                ArrayList<Integer> list = new ArrayList<>();
                list.add(midIndex);
                int temp = midIndex - 1;
                while (findVal == arr[temp] && temp >= 0) {
                    list.add(temp);
                    temp--;
                }
                temp = midIndex + 1;
                while (findVal == arr[temp] && temp < arr.length) {
                    list.add(temp);
                    temp++;
                }
                return list;
            }
        }
        return null;
    }
}

?

public class 插值查找 {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 3, 3, 3, 3, 3, 3, 4, 5, 6, 7, 8, 9, 10};
        int i = inserSearch2(arr, 6, 0, arr.length - 1);
        System.out.println(i);
        ArrayList<Integer> list=inserSearch3(arr,3,0,arr.length-1);
        System.out.println(list);

    }
    public static int inserSearch2(int[] arr, int key, int left, int right) {
        while (left <= right && key >= arr[0] && key <= arr[arr.length - 1]) {//防止数组越界
            int midIndex = left + (key - arr[left]) / (arr[right] - arr[left]) * (right - left);
            if (key > arr[midIndex]) {
                left=midIndex+1;
            } else if (key < arr[midIndex]) {
                right=midIndex-1;
            } else if (key == arr[midIndex]) {
                return midIndex;
            }
        }
        return -1;
    }

    public static int inserSearch(int[] arr, int key, int left, int right) {
        if (left <= right && key >= arr[0] && key <= arr[arr.length - 1]) {//防止数组越界
            int midIndex = left + (key - arr[left]) / (arr[right] - arr[left]) * (right - left);
            if (key > arr[midIndex]) {
                return inserSearch(arr, key, midIndex + 1, right);
            } else if (key < arr[midIndex]) {
                return inserSearch(arr, key, left, midIndex - 1);
            } else if (key == arr[midIndex]) {
                return midIndex;
            }
        }
        return -1;
    }


    public static ArrayList<Integer> inserSearch3(int[] arr, int key, int left, int right) {
        if (left <= right && key >= arr[0] && key <= arr[arr.length - 1]) {//防止数组越界
            int midIndex = left + (key - arr[left]) / (arr[right] - arr[left]) * (right - left);
            if (key > arr[midIndex]) {
                return inserSearch3(arr, key, midIndex + 1, right);
            } else if (key < arr[midIndex]) {
                return inserSearch3(arr, key, left, midIndex - 1);
            } else if (key == arr[midIndex]) {
                ArrayList<Integer> list = new ArrayList<>();
                list.add(midIndex);
                int temp = midIndex - 1;
                while (arr[temp] == key && temp >= 0) {
                    list.add(temp);
                    temp--;
                }
                temp = midIndex + 1;
                while (arr[temp] == key && temp <= arr.length - 1) {
                    list.add(temp);
                    temp++;
                }
                return list;
            }
        }
        return null;
    }
}

?

?

public class 斐波那契查找 {
    public static void main(String[] args) {
        int[] arr = {4, 9, 12, 16, 20, 33, 34, 56, 77};
        int i = fibonacciSort(arr, 34);
        System.out.println(i);
    }

    public static int fibonacciSort(int[] arr, int key) {
        int[] F = fibonacciArray();
        //计算数组长度处于斐波那契数列的位置
        int i = 0;
        while (F[i] - 1 < arr.length) {
            i++;
        }
        int[] newArr = Arrays.copyOf(arr, F[i]);//数组扩容
        for (int x = arr.length; x < F[i]; x++) {//补齐后面
            newArr[x] = arr[arr.length - 1];
        }
        int left = 0;
        int right = arr.length - 1;
        while (left <= right && key >= arr[0] && key <= arr[arr.length - 1]) {
            int midIndex = left + F[i - 1] - 1;
            if (key > newArr[midIndex]) {
                left = midIndex + 1;
                i -= 2;
            } else if (key < newArr[midIndex]) {
                right = midIndex - 1;
                i -= 1;
            } else if (key == newArr[midIndex]) {
                return Math.min(midIndex, arr.length - 1);
            }
        }
        return -1;
    }

    public static int[] fibonacciArray() {
        int[] arr = new int[10];
        arr[0] = 1;
        arr[1] = 1;
        int i = 2;
        while (i < 10) {
            arr[i] = arr[i - 1] + arr[i - 2];
            i++;
        }
        return arr;
    }

?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-10 22:50:47  更:2022-03-10 22:52:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 13:50:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码