【知识积累】分析并实现O(N^2)的算法(对数器验证)

2023-11-08

 1、选择排序

package com.example.demo.algorithm;

import java.util.Arrays;

/**
 * @Description :
 * 选择排序
 *
 * 数据规模:N
 * 0 ~ N-1 (看 + 比) + 交换
 * 1 ~ N-1 (看 + 比) + 交换
 * 2 ~ N-1 (看 + 比) + 交换
 * 3 ~ N-1 (看 + 比) + 交换
 * i ~ N-1 (看 + 比) + 交换
 * ...
 * N-1 ~ N-1(看 + 比) + 交换
 *
 * 0 ~ N-1 (2) + 1
 * 1 ~ N-1 (2) + 1
 * 2 ~ N-1 (2) + 1
 * 3 ~ N-1 (2) + 1
 * i ~ N-1 (2) + 1
 * ...
 * N-1 ~ N-1(2) + 1
 *
 * 2 *(N-1 + N-2 + N-3 + ...) + N
 * = 2 * (aN^2 + bN + c) + N
 * = 2 * N^2 + 2bN + 2c + N
 * = O(N^2)
 * 舍弃低阶项和常数项
 *
 * @Author : Darren
 * @Date : 2020 年 12 月 28 日 19:39:08
 * @since : 1.0
 */
public class J001_SelectSort {

    public static void main(String[] args) {
        int count = 500000;
        int maxSize = 100;
        int maxValue = 100;
        boolean success = true;
        for (int i = 0; i < count; i++) {
            int[] var1 = generateRandomArray(maxSize, maxValue);
            int[] var2 = copyArray(var1);
            selectSort(var1);
            comparator(var2);
            if (!isEqual(var1, var2)){
                success = false;
                printArray(var1);
                printArray(var2);
                break;
            }
        }
        System.out.println(success ? "success" : "failure");
    }

    public static void selectSort(int[] arrays){
        if (arrays == null || arrays.length < 2){
            return;
        }
        // 0 ~ N-1  找到最小值,在哪,放到0位置上
        // 1 ~ n-1  找到最小值,在哪,放到1 位置上
        // 2 ~ n-1  找到最小值,在哪,放到2 位置上
        for (int i = 0; i < arrays.length - 1; i++){
            int minIndex = i;
            // i ~ N-1 上找最小值的下标,与当前的最小值minIndex替换
            for (int j = i + 1; j < arrays.length; j++){
                minIndex = arrays[j] < arrays[minIndex] ? j : minIndex;
            }
            swap(arrays, i, minIndex);
        }
    }

    public static void swap(int[] arrays, int i, int j) {
        int tmp = arrays[i];
        arrays[i] = arrays[j];
        arrays[j] = tmp;
    }

    /**
     * 生成一个随机数组
     * @param maxSize
     * @param maxValue
     * @return
     */
    public static int[] generateRandomArray(int maxSize, int maxValue){
        //Math.random() [0,1)
        //Math.random() * N [0,N)
        //(int)(Math.random() * N) [0,N-1]
        int[] arrays = new int[(int) ((maxSize+1) * Math.random())];
        for (int i = 0; i < arrays.length; i++) {
            arrays[i] = (int) ((maxValue+1) * Math.random()) - (int)(maxValue * Math.random());
        }
        return arrays;
    }

    /**
     * 生成一个随机数
     * @param maxValue
     * @return
     */
    public static int generateRandom(int maxValue){
        return (int) ((maxValue+1) * Math.random()) - (int)(maxValue * Math.random());
    }

    /**
     * java自带排序
     * @param arrays
     */
    public static void comparator(int[] arrays){
        Arrays.sort(arrays);
    }

    /**
     * java自带复制数组
     * @param arrays
     * @return
     */
    public static int[] copyArray(int[] arrays){
        return Arrays.copyOf(arrays, arrays.length);
    }

    /**
     * 判断两个数组是否相等
     * @param var1
     * @param var2
     * @return
     */
    public static boolean isEqual(int[] var1, int[] var2){
        if ((var1 == null && var2 != null) || (var1 != null && var2 == null)){
            return false;
        }
        if(var1 == null && var2 == null){
            return true;
        }
        if (var1.length != var2.length){
            return false;
        }
        for (int i = 0; i < var1.length; i++) {
            if (var1[i] != var2[i]){
                return false;
            }
        }
        return true;
    }

    /**
     * 打印数组
     * @param arrays
     */
    public static void printArray(int[] arrays){
        if (arrays == null){
            return;
        }
        for (int i = 0; i < arrays.length; i++) {
            System.out.print(arrays[i] + " ");
        }
        System.out.println();
    }
}

2、冒泡排序

package com.example.demo.algorithm;

/**
 * @Description :
 * 冒泡排序
 *
 * 0 ~ N-1 0位置的数和后面的每个数比较,将较大值不断的往后移 N-1位置放最大值
 * 0 ~ N-2 0位置的数和后面的每个数比较,将较大值不断的往后移 N-2位置放最大值
 * 0 ~ N-3 0位置的数和后面的每个数比较,将较大值不断的往后移 N-3位置放最大值
 * 0 ~ N-i 0位置的数和后面的每个数比较,将较大值不断的往后移 N-i位置放最大值
 *  ……
 * 0 ~ 0 终止
 *
 * @Author : Darren
 * @Date : 2020 年 12 月 28 日 19:39:08
 * @since : 1.0
 */
public class J002_BubbleSort {

    public static void main(String[] args) {
        int count = 500000;
        int maxSize = 100;
        int maxValue = 100;
        boolean success = true;
        for (int i = 0; i < count; i++) {
            int[] var1 = J001_SelectSort.generateRandomArray(maxSize, maxValue);
            int[] var2 = J001_SelectSort.copyArray(var1);
            bubbleSort(var1);
            J001_SelectSort.comparator(var2);
            if (!J001_SelectSort.isEqual(var1, var2)){
                success = false;
                J001_SelectSort.printArray(var1);
                J001_SelectSort.printArray(var2);
                break;
            }
        }
        System.out.println(success ? "success" : "failure");
    }

    public static void bubbleSort(int[] arrays){
        if (arrays == null || arrays.length < 2){
            return;
        }
        //0 ~ N-1
        //0 ~ N-2
        //0 ~ N-3
        for (int i = arrays.length - 1; i >= 0; i--) {
            //内循环一次  i位置的数就排好序了
            for (int j = 0; j < i; j++) {
                if (arrays[j] > arrays[j+1]){
                    J001_SelectSort.swap(arrays, j, j+1);
                }
            }
        }
    }

}

3、插入排序

package com.example.demo.algorithm;

/**
 * @Description :
 * 插入排序
 *
 * 0 ~ 0 想做到有序 默认有序
 * 0 ~ 1 想做到有序 1位置往前看  小则交换
 * 0 ~ 2 想做到有序 2位置往前看  小则交换
 * 0 ~ i 想做到有序 i位置往前看  小则交换
 * ……
 * 0 ~ N-1 想做到有序 N-1位置往前看 小则交换
 *
 * @Author : Darren
 * @Date : 2021 年 02 月 07 日 19:29:30
 * @since : 1.0
 */
public class J003_InsertionSort {

    public static void main(String[] args) {
        int count = 500000;
        int maxSize = 100;
        int maxValue = 100;
        boolean success = true;
        for (int i = 0; i < count; i++) {
            int[] var1 = J001_SelectSort.generateRandomArray(maxSize, maxValue);
            int[] var2 = J001_SelectSort.copyArray(var1);
            insertionSort(var1);
            J001_SelectSort.comparator(var2);
            if (!J001_SelectSort.isEqual(var1, var2)){
                success = false;
                J001_SelectSort.printArray(var1);
                J001_SelectSort.printArray(var2);
                break;
            }
        }
        System.out.println(success ? "success" : "failure");
    }

    public static void insertionSort(int[] arrays){
        if (arrays == null || arrays.length < 2){
            return;
        }
        // 0 ~ 0 想做到有序 默认有序
        // 0 ~ 1 想做到有序 1位置往前看  小则交换
        // 0 ~ 2 想做到有序 2位置往前看  小则交换
        // 0 ~ i 想做到有序 i位置往前看  小则交换
        for (int i = 1; i < arrays.length; i++) {
            //i=1 j=0 -> 0位置和1位置比较 0~1位置有序
            //i=2 j=1 -> 1位置和2位置比较 0位置和1位置比较 0~2位置有序
            //i=3 j=2 -> 2位置和3位置比较 1位置和2位置比较 0位置和1位置比较 0~3位置有序
            //将j+1插入到合适的位置
            for (int j = i - 1; j >= 0; j--) {
                if (arrays[j] > arrays[j+1]){
                    J001_SelectSort.swap(arrays, j, j+1);
                }
            }
        }
    }
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【知识积累】分析并实现O(N^2)的算法(对数器验证) 的相关文章

  • java 循环遍历字符串_Java 程序迭代遍历字符串中的每个字符

    Java 程序迭代遍历字符串中的每个字符 在本教程中 我们将学习遍历字符串的每个字符 要理解此示例 您应该了解以下Java编程主题 示例1 使用for循环遍历字符串的每个字符 示例class Main public static void
  • Python第三课

    枭 Python第三课 今天讲解了Python的 深浅复制 列表排序与逆序 随机数 列表推导式 深浅复制 浅复制 概念 浅复制是生成一个新的列表 把原列表的所有引用全复制到新列表中 切片返回的就是浅复制 在浅复制中 如若旧列表中包含有列表
  • 图的存储和遍历

    一 图的存储 因为图中既有节点 又有边 节点与节点之间的关系 因此 在图的存储中 只需要保存 节点和 边关系即可 节点保存比较简单 只需要一段连续空间即可 1 邻接矩阵 因为节点与节点之间的关系就是连通与否 即为0或者1 因此邻接矩阵 二维
  • 区块链应用到供应链上,有哪些好处?

    据中企通宝区块链技术研究中心的负责人介绍 使用区块链的最突出的优势之一 就是它可以让数据的交互性更强 由于这点 公司可以更容易地和制造商还有供应商等等来分享信息和数据 区块链的透明性可以帮助减少延迟 同时防止产品停滞在供应链 每个产品都能实

随机推荐

  • JWT 详解

    1 JWT是什么 JSON Web Token JWT 是一个开放标准 RFC 7519 它定义了一种紧凑的 自包含的方式 用于作为JSON对象在各方之间安全地传输信息 该信息可以被验证和信任 因为它是数字签名的 2 JWT和传统Sessi
  • 竞赛 Yolov安全帽佩戴检测 危险区域进入检测 - 深度学习 opencv

    1 前言 优质竞赛项目系列 今天要分享的是 Yolov安全帽佩戴检测 危险区域进入检测 学长这里给一个题目综合评分 每项满分5分 难度系数 3分 工作量 3分 创新点 4分 该项目较为新颖 适合作为竞赛课题方向 学长非常推荐 更多资料 项目
  • 用友U8+产品--操作系统、数据库、浏览器推荐支持一览表

    目录 业务场景 用友U8 各版本服务器安装 Windows 操作系统推荐一览表 用友U8 各版本客户端安装 Windows 操作系统推荐一览表 用友U8 各版本数据库安装 SQL Server 版本推荐一览表 用友U8 各版本WEB门户 浏
  • 物联网如何为智慧城市提供动力

    智慧城市可以创造一个基础设施顺畅 效率提升的乌托邦 改善城市地区的生活质量 促进当地经济发展 其影响意义重大 预计到 2024 年智慧城市基础设施的收入将超过 1000 亿美元 从改善公共交通到解决犯罪问题和提高能源效率 应有尽有 智慧城市
  • 基于卷积神经网络cnn的情感分析代码

    说先看一下这个图 它大体介绍了CNN的自然语言处理流程 1 首先每个单词对应一行 d 5表示分了5个维度 一般是分128维 300维之类的 这里为了方便 用d 5 这样的话矩阵就是7 5 2 然后第一步进行卷积的操作 分别使用了四行的卷积核
  • 机器学习面试笔记

    本文结合 百面机器学习 一书进行整理 1 为什么需要对数值类型的特征做归一化 对数值类型归一化可以将所有的特征都统一到一个大致相同的数值区间内 常用方法 1 线性函数归一化 对原始数据进行线性变换 使结果映射到 0 1 范围内 公式 2 零
  • 【数据异常校验】肖维勒准则(Chauvenet Criterion)处理异常数据

    介绍 在统计理论中 肖维勒准则 以William Chauvenet命名 是评估一组实验数据 一组异常值 是否可能是虚假的一种手段 肖维勒准则背后的想法是找到一个以正态分布的均值为中心的概率带 它应该合理地包含数据集的所有n个样本 通过这样
  • 在ios系统上实现更改IP地址

    在当今的互联网环境中 我们经常需要更改手机的IP地址来避免一些限制或保护我们的隐私 然而 在iOS系统上 更改IP地址并不像在其他平台上那么容易 因此 本文将分享一种简单的方法 帮助您在iOS系统上免费更改手机的IP地址 在iOS系统上 我
  • html账号不能为空,在HTML5 中,( )属性用于规定输入框填写的内容不能为空,否则不允许用户提交表单。...

    AT89C51单片机串行口的4种工作方式中 中则和的波特率是可调的 与定时器 计数器T1的溢出率有关 另外两种方式的波特率是固定的 协助扩散就是协同运输 属性输入是物质从高浓度侧转运到低浓度侧 不需要消耗能量 用于允许用户Task 2 Fi
  • stm32 hal库接收不定长数据程序

    协议层 串口通讯的数据包由发送设备通过自身的 TXD 接口传输到接收设备的 RXD 接口 在串口通讯的协议层中 规定了数据包的内容 它由启始位 主体数据 校验位以及停止位组成 通讯双方的数据包格式要约定一致才能正常收发数据 其组成见图 波特
  • HashMap和HashTable的区别(面试题)

    HashMap和HashTable的区别 面试题 概念 HashMap HashTable 对比 总结 概念 HashMap 基于哈希表的 Map 接口的实现 此实现提供所有可选的映射操作 并允许使用 null 值和 null 键 除了非同
  • MySQL创建数据库和创建数据表

    MySQL 创建数据库和创建数据表 MySQL 是最常用的数据库 在数据库操作中 基本都是增删改查操作 简称CRUD 在这之前 需要先安装好 MySQL 然后创建好数据库 数据表 操作用户 一 数据库操作语言 数据库在操作时 需要使用专门的
  • python中time方法,生成当前时间年月日时分秒

    在Python中 可以使用time模块中的strftime 方法结合时间格式化字符串来生成当前的年月日时分秒 下面是一个详细解释的示例代码 import time 获取当前时间的时间戳 current timestamp time time
  • png在ai转为路径_ai怎么把png转换为路径

    1 png格式转为ai格式 解决如何将png图像转换成清晰的ai或者cdr矢量图的步骤如下 1 打开PS软件 打开JPG的图片文件 文件 打开 选择图片存放的路径 找到文件 打开 png 429 230 60238 0 gt 2 这是一个非
  • jvm的启动过程

    一 JVM的装入环境和配置 在学习这个之前 我们需要了解一件事情 就是JDK和JRE的区别 JDK是面向开发人员使用的SDK 它提供了Java的开发环境和运行环境 JDK中包含了JRE JRE是Java的运行环境 是面向所有Java程序的使
  • elasticsearch得分设置以及分词器不同层次定义

    GET cat indices GET hotel search GET search query constant score filter term lvg mc 酒店 boost 1 2 DELETE my index PUT my
  • NLP——机器翻译中的Seq2Seq

    文章目录 框架 简介 Encoder Decoder CNN Seq2Seq Seq2Seq模型缺点 框架 简介 Seq2Seq 全称Sequence to Sequence 序列到序列 它是一种通用的编码器 解码器框架 这个框架最初是为了
  • Python中的MetaPathFinder

    MetaPathFinder 是 Python 导入系统中的一个关键组件 它与 sys meta path 列表紧密相关 sys meta path 是一个包含 MetaPathFinder 实例的列表 这些实例用于自定义模块的查找和加载逻
  • 外汇市场与交易系统读书笔记(1)

    本文为 外汇市场与交易系统 这本书的读书笔记 1 a 汇率报价一般有五个数字 包括小输掉 其中 精度最高到小数点后四位 一般而言 我们以五个数字中的最低位作为基本点 b 外汇即期汇率报价一般包含买入汇率和卖出汇率 例如usd jpy的汇率可
  • 【知识积累】分析并实现O(N^2)的算法(对数器验证)

    1 选择排序 package com example demo algorithm import java util Arrays Description 选择排序 数据规模 N 0 N 1 看 比 交换 1 N 1 看 比 交换 2 N