常见算法(java版)

冒泡排序

每次从数组中找出最大值放在数组的后面去。

关键步骤

确定总共需要做几轮: 数组的长度-1。

每轮比较几次:数组的长度 - 第i轮。

当前位置大于后一个位置则交换数据。

选择排序

每轮选择当前位置,开始找出后面的较小值与该位置交换。

关键点

确定总共需要选择几轮: 数组的长度-1。

控制每轮从当前位置为基准,与后面元素选择几次。

代码

java 复制代码
public class Test1 {
    public static void main(String[] args) {
        // 1、定义数组
        int[] arr = {5, 1, 3, 2};
        //           0  1  2  3

        // 2、定义一个循环控制选择几轮: arr.length - 1
        for (int i = 0; i < arr.length - 1; i++) {
            // i = 0   j =  1  2  3
            // i = 1   j =  2  3
            // i = 2   j =  3
            // 3、定义内部循环,控制选择几次
            for (int j = i + 1; j < arr.length; j++) {
                // 当前位:arr[i]
                // 如果有比当前位数据更小的,则交换
                if(arr[i] > arr[j]) {
                    int temp = arr[i];
                    arr[i] = arr[j];
                    arr[j] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
    }
}

二分查找

二分查询性能好,二分查找的前提是必须是排好序的数据。

二分查找相当于每次去掉一半的查找范围。

二分查找正常的检索条件应该是开始位置min <= 结束位置max 。

实现步骤

定义变量记录左边和右边位置。

使用while循环控制查询(条件是左边位置<=右边位置)

循环内部获取中间元素索引

判断当前要找的元素如果大于中间元素,左边位置=中间索引+1

判断当前要找的元素如果小于中间元素,右边位置=中间索引-1

判断当前要找的元素如果等于中间元素,返回当前中间元素索引。

代码

java 复制代码
public class Test2 {
    public static void main(String[] args) {
        // 1、定义数组
        int[] arr = {10, 14, 16, 25, 28, 30, 35, 88, 100};
        //                                            r
        //                                                l
        //
        System.out.println(binarySearch(arr , 35));
        System.out.println(binarySearch(arr , 350));
    }
    /**
     * 二分查找算法的实现
     * @param arr  排序的数组
     * @param data 要找的数据
     * @return  索引,如果元素不存在,直接返回-1
     */
    public static int binarySearch(int[] arr, int data){
        // 1、定义左边位置  和 右边位置
        int left = 0;
        int right = arr.length - 1;

        // 2、开始循环,折半查询。
        while (left <= right){
            // 取中间索引
            int middleIndex = (left + right) / 2;
            // 3、判断当前中间位置的元素和要找的元素的大小情况
            if(data > arr[middleIndex]) {
                // 往右边找,左位置更新为 = 中间索引+1
                left = middleIndex + 1;
            }else if(data < arr[middleIndex]) {
                // 往左边找,右边位置 = 中间索引 - 1
                right = middleIndex - 1;
            }else {
                return middleIndex;
            }
        }
        return -1; // 查无此元素
    }

}
相关推荐
焦耳加热1 小时前
阿德莱德大学Nat. Commun.:盐模板策略实现废弃塑料到单原子催化剂的高值转化,推动环境与能源催化应用
人工智能·算法·机器学习·能源·材料工程
wan5555cn1 小时前
多张图片生成视频模型技术深度解析
人工智能·笔记·深度学习·算法·音视频
u6062 小时前
常用排序算法核心知识点梳理
算法·排序
蒋星熠4 小时前
Flutter跨平台工程实践与原理透视:从渲染引擎到高质产物
开发语言·python·算法·flutter·设计模式·性能优化·硬件工程
小欣加油4 小时前
leetcode 面试题01.02判定是否互为字符重排
数据结构·c++·算法·leetcode·职场和发展
3Cloudream4 小时前
LeetCode 003. 无重复字符的最长子串 - 滑动窗口与哈希表详解
算法·leetcode·字符串·双指针·滑动窗口·哈希表·中等
王璐WL5 小时前
【c++】c++第一课:命名空间
数据结构·c++·算法
空白到白5 小时前
机器学习-聚类
人工智能·算法·机器学习·聚类
索迪迈科技5 小时前
java后端工程师进修ing(研一版 || day40)
java·开发语言·学习·算法
zzzsde6 小时前
【数据结构】队列
数据结构·算法