常见算法(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; // 查无此元素
    }

}
相关推荐
import_random21 分钟前
[机器学习]xgboost和lightgbm(区别)
算法
梁辰兴22 分钟前
数据结构:实验7.3Huffman树与Huffman编码
数据结构·c++·算法·c
wuqingshun31415925 分钟前
经典算法 最长单调递增子序列
java·c++·算法·蓝桥杯·机器人
企鹅chi月饼30 分钟前
动态规划问题,下降路径最小和(dp初始化问题,状态压缩),单词拆分(回溯法+剪枝+记忆化),substr函数
算法·动态规划
苯酸氨酰糖化物36 分钟前
计算机毕业设计--基于深度学习(U-Net与多尺度ViT)的车牌模糊图像修复算法设计与实现(含Github代码+Web端在线体验界面)
深度学习·算法·课程设计
豆沙沙包?1 小时前
2025年- H13-Lc120-189.轮转数组(普通数组)---java版
java·算法·排序算法
吃不饱的得可可1 小时前
【算法】单词搜索、最短距离
算法·深度优先
ricky_fan1 小时前
LeetCode:55.跳跃游戏——局部最优并非全局最优!
算法·leetcode·游戏
一只码代码的章鱼2 小时前
学习笔记(算法学习+Maven)
笔记·学习·算法
keep intensify2 小时前
数据结构---单链表的增删查改
c语言·数据结构·c++·经验分享·学习·算法·分享