1、认识时间复杂度和简单的排序算法

news2025/7/7 20:58:05

目录

  • 时间复杂度
  • 选择排序
  • 冒泡排序
  • 异或交换
    • 解释
    • 案例
    • 综上
  • 插入排序
  • 二分查找
    • 拓展
  • 对数器

时间复杂度

  • 如果一个操作时间和数据量没有关系,则是常数时间的操作
    • 比如一个数组arr[n]这就是算一个偏移量,然后找到这个位置的值,这就是常数时间,和数组长度没有关系。
    • 而对于链表list.get(n),这就需要进行遍历直到找到n,这就和数据量有关系了。

这里举个选择排序的例子说明一下时间复杂度
在这里插入图片描述

  • 第一次循环确定最小值
    • 遍历n次,对比n-1次,交换1次
  • 第二次循环确定最小值
    • 遍历n-1次,对比n-2次,交换1次
  • 第三次循环确定最小值
    • 遍历n-2次,对比n-3次,交换1次

······

  • 第N次循环确定最小值
    • 遍历1次,对比0次,交换0次

把所有操作次数相加(n+n-1+n-2·····)+(n-1+n-2+····)+(1+1+1····)
算出来结果(系数就不细算了):an2+bn+1
取最高次项n2,所以时间复杂度为O(n2)

说明:还有最优时间复杂度和平均时间复杂度,但我们日常提及的都是最坏时间复杂度

选择排序

时间复杂度O(n2);空间复杂度O(1);

在这里插入图片描述

public class SelectionSort implements IArraySort {

    @Override
    public int[] sort(int[] sourceArray) throws Exception {
        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);

        // 总共要经过 N-1 轮比较
        for (int i = 0; i < arr.length - 1; i++) {
            int min = i;

            // 每轮需要比较的次数 N-i
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[j] < arr[min]) {
                    // 记录目前能找到的最小值元素的下标
                    min = j;
                }
            }

            // 将找到的最小值和i位置所在的值进行交换
            if (i != min) {
                int tmp = arr[i];
                arr[i] = arr[min];
                arr[min] = tmp;
            }

        }
        return arr;
    }
}

冒泡排序

时间复杂度O(n2);空间复杂度O(1);

在这里插入图片描述

public class BubbleSort implements IArraySort {

    @Override
    public int[] sort(int[] sourceArray) throws Exception {
        // 对 arr 进行拷贝,不改变参数内容
        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);

        for (int i = 1; i < arr.length; i++) {
            // 设定一个标记,若为true,则表示此次循环没有进行交换,也就是待排序列已经有序,排序已经完成。
            boolean flag = true;

            for (int j = 0; j < arr.length - i; j++) {
                if (arr[j] > arr[j + 1]) {
                    int tmp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = tmp;

                    flag = false;
                }
            }

            if (flag) {
                break;
            }
        }
        return arr;
    }
}

异或交换

解释

1^1=0; 0^0=0; 1^0=1,满足交换律结合律
所以自己和自己异或就为0;有点像消消乐,出现两次就消除。
这里有两个变量a,b(所占内存不相交),如何利用异或进行交换

a = a^b;
b = a^b;
a = a^b;

即可实现交换,但前提是这两个变量所占内存不相交,也就是相互不影响。

案例

  1. 一个数组,里面只有一种数字出现奇数次,其余数字皆出现偶数次,求出这个出现基数次的数字

分析出现偶数次,那异或就全都消失了。所以每一项进行异或,偶数次都会消失,剩下的就是出现奇数次的数字了。

  1. 一个数组,里面只有两种数字(不同)出现奇数次,其余数字皆出现偶数次,求出这个出现基数次的数字

每一项进行异或,偶数次都会消失,剩下的就是两个奇数次的数字相异或的结果了记为c。既然这两个数字不同,那异或就一定不为0,那我们找到这两个数字不同的地方,比如得到的结果0100,所以说明第三位这两个数字不同,那我们找做一个循环,重新遍历一下数组,第三位为1的(0的)进行异或,得到的结果就是其中一个数字记为a,剩下的数字,只需要a^c即可得到。

  • 这里遍历的时候怎么判断某一位为1或者0呢?
    1. 我们选择最低位的不同数字,取反加一与:c&(~c+1)
    2. 比如c=10011010,则~c+1=01100110;两个相与得到的就是00000010
    3. 然后遍历看谁00000010相与不为0,或为0,则为两种情况

综上

异或可以得到群体中落单的那数字

插入排序

时间复杂度:O(n2),空间复杂度:O(1)

在这里插入图片描述

public class InsertSort implements IArraySort {

    @Override
    public int[] sort(int[] sourceArray) throws Exception {
        // 对 arr 进行拷贝,不改变参数内容
        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);

        // 从下标为1的元素开始选择合适的位置插入,因为下标为0的只有一个元素,默认是有序的
        for (int i = 1; i < arr.length; i++) {

            // 记录要插入的数据
            int tmp = arr[i];

            // 从已经排序的序列最右边的开始比较,找到比其小的数
            int j = i;
            while (j > 0 && tmp < arr[j - 1]) {
                arr[j] = arr[j - 1];
                j--;
            }

            // 存在比其小的数,插入
            if (j != i) {
                arr[j] = tmp;
            }

        }
        return arr;
    }
}

如果数据排序较好时,时间复杂度就降到O(n)级别,但我们算时间复杂度都是按最差情况来看的

二分查找


public class RecursionDemo {
    public static void main(String[] args) {
        //二分查找 折半查找
        int[] arr = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
        int index = binarySearch(arr,0, arr.length - 1, 13);
        System.out.println(index);
    }
    //在数组arr中 L~R区间内进行二分搜索查找key的角标
    private static int binarySearch(int[] arr, int L, int R, int key) {
        if (L > R) {    //元素key不存在
            return -1;
        }
        int M = (L + R) / 2;
        if (arr[M] == key) {
            return M;
        }
        if (arr[M] < key) {
            return binarySearch(arr,M + 1, R, key);
        } else {
            return binarySearch(arr,L, M - 1, key);
        }
    }
}

拓展

  1. (升序有序列表)查找大于某个数字,最左侧的数字,即大于并且最靠近

思路:
二分查到一个数字,如果比它小则截取右边,否则截取左边,最后剩下两个数字,右侧的就是找的数字

  1. (升序有序列表)查找局部最小值,找到一个即可

思路:
查找中间的数字M,如果M小于M-1且小于M+1,那么它就是局部最小
如果他不满足M小于M-1且小于M+1,那就截取比它小的那一端
一直二分到最后一定可以找到一个最小值

对数器

这个老师也讲了,作用就是
做一个代码,它可以随机产生一个数组长度和内容,进行我们的代码测试
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/37096.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣(LeetCode)882. 细分图中的可到达节点(C++)

spfa 将边细分成节点&#xff0c;如果一条边细分出 nnn 个结点&#xff0c;那么边的两个端点距离 n1n1n1 &#xff0c;边长 n1n1n1。提示中给出&#xff0c;一共 300030003000 个初始结点&#xff0c;无向边的数目小于等于 100001000010000 &#xff0c;这是提示我们最多有 20…

服务器怎么远程连接控制

服务器怎么远程连接控制 我是艾西&#xff0c;还是有很多小白同学问我服务器怎么远程连接。那么今天我们重点来教教大家如何用电脑远程服务器配上图文教程&#xff0c;让不懂的新手小白一看就会&#xff0c;分分钟上手教程 远程服务器需要一台电脑俗称“PC”就是我们自己平时经…

红外遥控视力自动检测系统的设计与实现

红外线视力检测系统的设计与实现 实现方法 分为两部分 上位机-------------串口通讯-------------下位机 上位机&#xff1a;使用LabVIEW软件编写窗口软件。 串口通讯&#xff1a;USB线进行链接通讯。 下位机&#xff1a;AT89C52单片机开发板 说明&#xff1a;Labvi…

46-pytest-分布式插件pytest-xdist使用

分布式插件pytest-xdist使用前言安装插件分布式用例设计原则使用示例测试报告按一定顺序执行前言 本篇来学习下在pytest中分布式执行测试用例&#xff0c;以节省测试时间。 安装插件 pip install pytest-xdist分布式用例设计原则 用例之间是独立的&#xff0c;用例之间没有…

学生护眼台灯哪个牌子最好?2022双十二4款儿童护眼写字灯推荐

现在的孩子学业压力越来越大了&#xff0c;眼睛也是长期高强度使用&#xff0c;不堪重负&#xff0c;如果不注意保护&#xff0c;加上年龄偏小身体器官尚未发育完全&#xff0c;极易出现各种眼睛问题。所以对于经常晚上看书写字的学生群体来说&#xff0c;有一个健康护眼的照明…

OpenGL ES 学习(二) -- 渲染模式和GLSL

上一章&#xff0c;我们学习了 OpenGL 的基本知识&#xff0c;这一章&#xff0c;一起学习OpenGL的渲染模式和渲染语言GLSL。 一. 渲染流程 OpenGL的渲染流程如下图所示&#xff1a; 从这里看出&#xff0c;OpenGL 需要使用顶点着色器&#xff0c;先绘制好轮廓&#xff0c;再…

Java面向对象之——多态

文章目录一、多态的概念二、多态的条件三、重写四、向上转型和向下转型1、向上转型2、向下转型五、再谈多态六、多态的优缺点总结一、多态的概念 多态是同一个行为具有多个不同表现形式或形态的能力。就比如人吃饭&#xff0c;对于中国人使用筷子吃饭&#xff0c;美国人使用刀…

C. Almost All Multiples(贪心 + 思维)

Problem - C - Codeforces 给定两个整数n和x&#xff0c;如果pi是i的倍数&#xff0c;所有1≤i≤n-1&#xff0c;pn1&#xff0c;且p1x&#xff0c;则长度为n的排列组合† p被称为搞笑。 找出最小的有趣的排列组合&#xff0c;或报告说不存在这样的排列组合。 † 长度为n的排…

分布式学习必看:十年架构大佬带你从零开始学习分布式服务框架!

前言 最近在看《架构探险-从零开始写分布式服务框架》&#xff0c;对于分布式框架的入门级选手还是挺合适的&#xff0c;扫盲。对分布式服务框架中的基本概念&#xff1a;RPC、SOA、序列化、Spring集成RPC、ZooKeeper、I/O模型、Netty、软负载、服务治理做了系统介绍。手写了R…

【知识网络分析】引文网络(citation)

引文网络(citation) 1 读取本地文献并构建引文网络数据集2 网络数据集精简3 剔除孤立点方法封装4 网络图美化5 社团群体划分并结合色谱图显示6 网络节点中心度相关指标计算1 读取本地文献并构建引文网络数据集 新建一个notebook文件后,导入需要使用的包,本案例使用WOS数据…

进程、线程、 Thread类的基本用法 【javaee】

目录 一、什么是进程/任务&#xff08;Process/Task&#xff09; 二、什么是线程&#xff08;Thread&#xff09; 三、进程和线程的区别 四、创建线程的方法&#xff1a; 方法1 继承 Thread &#xff0c;重写run 方法2 实现 Runnable 接口 方法3 匿名内部类创建 Thread …

数据库的常用操作

数据库的分类 数据库大体可以分为 关系型数据库 和 非关系型数据库 关系型数据库&#xff1a;是指采用了关系模型来组织数据的数据库&#xff0c;关系模型指的就是二维表格模型&#xff0c;关系型数据库都基于标准的SQL&#xff0c;只是内部一些实现有区别 常见关系型数据库…

奇舞周刊第 473 期: Rollup 与 Webpack 的 Tree-shaking

记得点击文章末尾的“ 阅读原文 ”查看哟~下面先一起看下本期周刊 摘要 吧~奇舞推荐■ ■ ■Rollup 与 Webpack 的 Tree-shakingRollup 和 Webpack 是目前项目中使用较为广泛的两种打包工具&#xff0c;去年发布的 Vite 中打包所依赖的也是 Rollup&#xff1b;在对界面加载效率…

Java项目:JSP手机商城管理系统包含前台

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 本项目分为前后台&#xff0c;分为管理员与普通用户两种角色&#xff0c;管理员登录后台&#xff0c;普通用户登录前台&#xff1b; 管理员角色…

编译原理之词法分析器随笔和简单实现

借鉴: 编译原理之美. 极客时间上 什么是词法分析 编译原理&#xff1a;词法分析简单的来说就是在字符串中提取一系列的word单词. 编译器的眼里, 我们的一切输入都是什么? 都是一个一个的字符串. 所以编译器干的就是字符串解析工作. 词法分析&#xff1a;自然就是解析出来…

Vue中el和data的写法与 MVVM模型

目录 el和data的两种写法 el的两种写法 data的两种写法 data与el的写法小结 MVVM模型 MVVM模型小结 el和data的两种写法 el的两种写法 <body> <div id"root"> hello,{{name}}</div><script type"text/javascript">const vm ne…

iwebsec靶场 SQL注入漏洞通关笔记3- bool注入(布尔型盲注)

系列文章目录 iwebsec靶场 SQL注入漏洞通关笔记1- 数字型注入_mooyuan的博客-CSDN博客 iwebsec靶场 SQL注入漏洞通关笔记2- 字符型注入&#xff08;宽字节注入&#xff09;_mooyuan的博客-CSDN博客 目录 文章目录 前言 一、源码分析 二、sqlmap渗透 1.注入命令 2.完整交互过程…

小技巧1:如何给pip install进行换源

大家好&#xff0c;我是Kamen Black君&#xff0c;今天给大家介绍一个小技巧&#xff1a;如何给pip安装进行换源。 print("祝大家每天快乐&#xff0c;love and peace&#xff01;") 曾几何时&#xff0c;当我准备好了一段很有趣的代码准备进行运行时&#xff0c;发…

亚马逊云科技re:Invent:这些成功的数据驱动新企业背后的秘诀是什么?

北京时间11月29号&#xff0c;亚马逊云科技年度峰会re:Invent 2022将在拉斯维加斯开幕。这场年度最重磅的云计算技术大会不仅是科技盛宴&#xff0c;也是亚马逊云科技与诸多客户交流互鉴的绝佳平台&#xff0c;今天带大家认识一下几位资深云计算用户&#xff0c;以及他们和re:I…

ENVI5.6超详细教程大全-从安装包到安装流程详解

一、获取资源&#xff1a; https://www.xsoftnet.com/share/a000HzsWPCJXi.html二、安装教程&#xff1a;安装前请关闭杀毒软件&#xff0c;系统防火墙&#xff0c;断开网络连接 1.解压ENVI5.6安装包&#xff1a;ENVI5.6.zip 2.找到envi56-win.exe文件&#xff0c;双击进行安装…