首页 > 编程语言 >算法基础一

算法基础一

时间:2025-01-03 16:15:47浏览次数:1  
标签:arr int void 基础 算法 static 排序 public

认识时间复杂度

常数时间的操作

一个操作如果和样本的数据量没有关系,每次都是固定时间内完成的操作,叫做常数操作。

时间复杂度为一个算法流程中,常数操作数量的一个指标。常用O(读作big O)来表示。具体

来说,先要对一个算法流程非常熟悉,然后去写出这个算法流程中,发生了多少常数操作,

进而总结出常数操作数量的表达式。

在表达式中,只要高阶项,不要低阶项,也不要高阶项的系数,剩下的部分如果为f(N),那

么时间复杂度为O(f(N))。

评价一个算法流程的好坏,先看时间复杂度的指标,然后再分析不同数据样本下的实际运行

时间,也就是“常数项时间”。

选择排序、冒泡排序细节与复杂度分析

时间复杂度O(N^2),额外空间复杂度O(1)

选择排序

它的基本思想是每次从未排序的部分中选择最小(或最大)的元素,放到已排序部分的末尾。

选择
 public class selectionSort {
    public static void swap(int arr[], int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    public static void selection(int arr[]) {
        int len = arr.length;

        for (int i = 0; i < len; i++) {
            int tempMaxInt = i;//假设未排序部分的最左端是最大值
            for (int j = i + 1; j < len; j++) {
                if (arr[tempMaxInt] < arr[j]) {
                    tempMaxInt = j;//遍历未排序部分,发现更大的值,记录下最大的值索引
                }
            }
            swap(arr, tempMaxInt, i);//把未排序部分得最大值和已排序部分得下一个,也即是未排序部分得第一个交换
            //然后排序部分向右扩
        }
    }

    public static void main(String args[]) {
        int arr[] = { 5, 4, 1, 3, 2 };
        selection(arr);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}

 冒泡排序

冒泡
 public class bubbleSort {
    public static void swap(int arr[], int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }

    public static void _bubbleSort(int arr[]) {
        int len = arr.length;
        for (int i = 0; i < len; i++) {
            boolean flag = false;
            for (int j = len - 1; j > i; j--) {
                if (arr[j] > arr[j - 1]) {
                    swap(arr, j - 1, j);
                    flag = true;
                }
            }
            if (!flag) {
                break;
            }
        }
    }

    public static void main(String[] args) {
        int arr[] = { 5, 4, 1, 3, 2 };
        _bubbleSort(arr);
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
    }
}

 

 

插入排序

 它的核心思想是将未排序部分的元素逐个插入到已排序部分的正确位置。

插入
 public class insertSort {

    // 插入排序方法
    public static void insertionSort(int[] arr) {
        int n = arr.length;

        // 从第二个元素开始,逐个插入到已排序部分
        for (int i = 1; i < n; i++) {
            int key = arr[i]; // 当前需要插入的元素
            int j = i - 1;

            // 将比 key 大的元素向后移动
            while (j >= 0 && arr[j] > key) {
                arr[j + 1] = arr[j];
                j--;
            }

            // 插入 key 到正确位置
            arr[j + 1] = key;
        }
    }

    // 打印数组的方法
    public static void printArray(int[] arr) {
        for (int num : arr) {
            System.out.print(num + " ");
        }
        System.out.println();
    }

    // 主方法:测试插入排序
    public static void main(String[] args) {
        int[] arr = { 12, 11, 13, 5, 6 }; // 待排序的数组

        System.out.println("排序前的数组:");
        printArray(arr);

        // 调用插入排序方法
        insertionSort(arr);

        System.out.println("排序后的数组:");
        printArray(arr);
    }
}

 

 二分查找

它的核心思想是通过不断缩小查找范围,将查找时间复杂度从 O(n) 降低到 O(log n)

二分查找
 public class BinarySearch {

    // 二分查找方法
    public static int binarySearch(int[] arr, int target) {
        int left = 0;
        int right = arr.length - 1;

        while (left <= right) {
            int mid = left + (right - left) / 2; // 计算中间位置
            if (arr[mid] == target) {
                return mid; // 找到目标值,返回索引
            } else if (arr[mid] < target) {
                left = mid + 1; // 目标值在右半部分
            } else {
                right = mid - 1; // 目标值在左半部分
            }
        }
        return -1; // 未找到目标值
    }

    // 主方法:测试二分查找
    public static void main(String[] args) {
        int[] arr = {1, 3, 5, 7, 9, 11}; // 有序数组
        int target = 7; // 目标值

        int result = binarySearch(arr, target);
        if (result != -1) {
            System.out.println("目标值 " + target + " 的索引是: " + result);
        } else {
            System.out.println("目标值 " + target + " 未找到");
        }
    }
}

对数器

它的核心思想是通过对比待测试算法和一个已知正确的算法(通常是一个暴力解法或标准库函数),在大量随机测试数据上运行,确保两者结果一致。

master公式(适用与分治类型的)

T(N) = a*T(N/b) + O(N^d)

a表示每次递归产生的子问题数量

b表示相对原问题缩小的比例 

O(N^d) 表示原问题分解为子问题以及合并子问题解所需的工作量

 

标签:arr,int,void,基础,算法,static,排序,public
From: https://www.cnblogs.com/dingtongya/p/18650300

相关文章

  • K均值聚类算法的入门指南
    大家好!今天我们来聊聊机器学习中的一个经典算法——K均值聚类(K-MeansClustering)我们从两个方面来进行了解:什么是K均值聚类?为什么叫K均值?什么是K均值聚类?K均值聚类(K-MeansClustering)是一种非常流行的机器学习算法,用于将数据集分成K个不同的组,这些组被称为“簇”。这个......
  • 电脑常用的28个基础操作
    电脑常用的28个基础操作1.快速打开资源管理器按Windows+E,可瞬间启动资源管理器。2.快速清理缓存电脑运行缓慢?按下Ctrl+Shift+R,可快速清除缓存3.快速关机、重启按下Ctrl+Alt+Del,选择任务管理器中的重启,长按Ctr系统会迅速重新启动,同理,选择【关机】可快速关机4.窗口最大化与......
  • Stable Diffusion|图生图基础教程
    本教程旨在为广大对SD图生图技术感兴趣的学习者提供一个系统性的入门指南,帮助大家揭开这一前沿技术的神秘面纱,逐步掌握其应用方法。#01/如何使用图生图并不是单纯的直接由图片生成图片,原始图片只是做主体参考图,打个比喻,你要做一道经典的意大利肉酱面,这是“原图”,现在,你想......
  • STM32:OLED(显示屏)开发基础
      思路:了解OLED相关资料----配置参数(OLED底层驱动移植)---编写代码【含例题】---烧入开发板 一、了解OLED相关资料1.什么是OLED?全称:OrganicLight-EmittingDisplay(有机发光二极管),其作用能将电能直接转化为光能的半导体器件,属于电流型的有机发光器件。2.OLED的四个......
  • SQL基础应用
    MySQL内置的功能连接数据库-u-p-S-h-P-e<本地登录:mysql-uroot-p密码-S/tmp/mysql.sock远程登录:mysql-u用户名-p密码-hMySQLIP地址-P3306免交互执行sql语句:mysql-u用户名-p密码-e"showdatabases;"恢复数据:mysql-uroot-p123.com</root/world.sq......
  • 【基础篇重点】六、MySQL表的增删查改
    文章目录前言Ⅰ.创建新数据1、`insert`语句2、插入否则更新--替换3、替换--`replace`Ⅱ.检索数据1、`select`语句①全列查询②指定列查询③查询字段为表达式④为查询结果指定别名`as`⑤结果去重`distinct`2、`where`条件......
  • 【基础篇】七、MySQL内置函数
    文章目录Ⅰ.日期函数案例一案例二Ⅱ.字符串函数常见字符串函数使用案例1、显示对应的字符集--`charset`2、要求显示exam_result表中的信息,显示格式:“XXX的语文是XXX分,数学XXX分,英语XXX分”--`concat`3、求学生表中学生姓名占用的字节数--`length`4、......
  • 【狂热算法篇】解锁数据潜能:探秘前沿 LIS 算法
     嘿,各位编程爱好者们!今天带来的LIS算法简直太赞啦无论你是刚入门的小白,还是经验丰富的大神,都能从这里找到算法的奇妙之处哦!这里不仅有清晰易懂的C++代码实现,还有超详细的算法讲解,让你轻松掌握LIS算法的三种解法:暴力、动态规划、贪心加二分查找,彻底搞懂它在数据处理、......
  • 2025如何在CTF比赛中取得名次?零基础必看
    在CTF(CaptureTheFlag)比赛中取得好名次,关键在于系统化的学习与实践。下面是提升CTF比赛能力的一些建议和策略:1.基础知识的扎实积累CTF学习路线&工具及题型解析等籽料我已经给大家整理好了,【点这里自取即可】在CTF比赛中,掌握相关基础知识至......
  • 2025如何在CTF比赛中取得名次?零基础必看
    在CTF(CaptureTheFlag)比赛中取得好名次,关键在于系统化的学习与实践。下面是提升CTF比赛能力的一些建议和策略:1.基础知识的扎实积累CTF学习路线&工具及题型解析等籽料我已经给大家整理好了,【点这里自取即可】在CTF比赛中,掌握相关基础知识至关......