• 二分查找算法


    使用循环实现&使用递归实现

    package com.pt.spring.learn.bean;
    
    import java.util.ArrayDeque;
    import java.util.Queue;
    
    public class BinFind {
        public static void main(String[] args) {
            int[] array = new int[]{1, 2, 3, 4, 5, 7, 8, 9, 10};
            System.out.println(binFind(array, 0, 8, 8));
            System.out.println(binSearchLoop(array, 0, 8, 9));
        }
    
        public static int binSearchLoop(int[] array, int startIndex, int endIndex, int objectValue) {
            Queue<int[]> paramsQueue = new ArrayDeque<>();
            paramsQueue.add(new int[]{startIndex, endIndex});
            while (!paramsQueue.isEmpty()) {
                int[] tmpParams = paramsQueue.poll();
                startIndex = tmpParams[0];
                endIndex = tmpParams[1];
                if (objectValue > array[endIndex] || objectValue < array[startIndex] || startIndex > endIndex) {
                    return -1;
                }
                if (startIndex == endIndex && array[endIndex] != objectValue) {
                    return -1;
                }
    
                int mid = (startIndex + endIndex) / 2;
                if (array[mid] == objectValue) {
                    return mid;
                }
    
                if (array[mid] > objectValue) {
                    paramsQueue.add(new int[]{startIndex, mid});
                } else {
                    paramsQueue.add(new int[]{mid + 1, endIndex});
                }
            }
            return -1;
        }
    
        public static int binFind(int[] array, int startIndex, int endIndex, int objectValue) {
            if (objectValue > array[endIndex] || objectValue < array[startIndex] || startIndex > endIndex) {
                return -1;
            }
            if (startIndex == endIndex && array[endIndex] != objectValue) {
                return -1;
            }
    
            int mid = (startIndex + endIndex) / 2;
            if (array[mid] == objectValue) {
                return mid;
            }
    
            if (array[mid] > objectValue) {
                return binFind(array, startIndex, mid, objectValue);
            } else {
                return binFind(array, mid + 1, endIndex, objectValue);
            }
        }
    
    
    }

    树表查找,包括二叉搜索树的构建与元素查找;

    package com.pt.spring.learn.bean;
    
    /**
     * 二叉查找树:
     * 某节点如果左子树不为空,左子树上所有节点的值都小于该节点的值
     * 如果右子树不为空,右子树上所有节点的值都大于该节点的值
     * 左右子树也都是二叉查找树
     */
    public class BinarySearchTree {
        public static void main(String[] args) {
            System.out.println("-----start run----");
            int[] array = new int[]{8, 6, 9, 7, 1, 3, 5};
            //构建二叉查找树
            Node root = null;
            for (int i = 0; i < array.length; i++) {
                root = insert(root, array[i]);
            }
            System.out.println(root);
    
            //查找
            Node get = searchNode(root, 90);
            System.out.println(get);
    
        }
    
        static Node searchNode(Node root, int data) {
            if (root == null) {
                return null;
            }
            if (root.value == data) {
                return root;
            }
    
            if (root.value > data) {
                return searchNode(root.leftNode, data);
            } else {
                return searchNode(root.rightNode, data);
            }
        }
    
        static Node insert(Node root, int data) {
            if (root == null) {
                return new Node(data);
            }
            if (root.value >= data) {
                root.leftNode = insert(root.leftNode, data);
            } else {
                root.rightNode = insert(root.rightNode, data);
            }
            return root;
        }
    
        static class Node {
            Integer value;
            Node leftNode;
            Node rightNode;
    
            public Node(Integer value) {
                this.value = value;
            }
    
            @Override
            public String toString() {
                return "{" +
                        ""value":" + value +
                        ", "leftNode":" + leftNode +
                        ", "rightNode":" + rightNode +
                        '}';
            }
        }
    }
  • 相关阅读:
    DevExpress gridcontrol添加了复选框删除选中的多行/批量删除的方法
    PowerDesigner中在生成的数据库脚本中用name列替换comment列作为字段描述的方法
    int.TryParse 与 int.Parse 的区别
    .NET winform 的keypress事件中判断当用户按下的是哪个键
    XtraReport改变纸张方向
    .NET的 DataTable中某列求和
    SQL UNION 操作符
    如何在VUE中使用leaflet地图框架
    eslint+prettier 的 VSCode配置项
    前端使用Git 切换分支 查看线上远程,本地切换
  • 原文地址:https://www.cnblogs.com/tengpan-cn/p/9886337.html
Copyright © 2020-2023  润新知