java时间复杂度与空间复杂度的排序

news2025/1/10 23:59:49

怎么理解时间复杂度和空间复杂度

时间复杂度和空间复杂度一般是针对算法而言,是衡量一个算法是否高效的重要标准。先纠正一个误区,时间复杂度并不是算法执行的时间,再纠正一个误区,算法不单单指冒泡排序之类的,一个循环甚至是一个判断都可以称之为算法。其实理解起来并不冲突,八大排序甚至更多的算法本质上也是通过各种循环判断来实现的。

时间复杂度:指算法语句的执行次数。O(1),O(n),O(logn),O(n2)

空间复杂度:就是一个算法在运行过程中临时占用的存储空间大小,换句话说就是被创建次数最多的变量,它被创建了多少次,那么这个算法的空间复杂度就是多少。有个规律,如果算法语句中就有创建对象,那么这个算法的时间复杂度和空间复杂度一般一致,很好理解,算法语句被执行了多少次就创建了多少对象。

数组和链表结构简单对比

数组:相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为下标

数组的特性:

1.数组必须先定义固定长度,不能适应数据动态增减

2.当数据增加时,可能超出原先定义的元素个数,当数据减少时,造成内存浪费

3.数组查询比较方便,根据下标就可以直接找到元素,时间复杂度 O(1);增加和删除比较复杂,需要移动操作数所在位置后的所有数据,时间复杂度为 O(N)

链表:是一种物理存储单元上非连续,非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

链表的特性:

1.链表动态进行存储分配,可适应数据动态增减

2.插入、删除数据比较方便,时间复杂度 O(1);查询必须从头开始找起,十分麻烦,时间复杂度 O(N)

常见的链表:

1.单链表:通常链表每一个元素都要保存一个指向下一个元素的指针

2.双链表:每个元素既要保存到下一个元素的指针,还要保存一个上一个元素的指针

3.循环链表:在最后一个元素中下一个元素指针指向首元素

链表和数组都是在堆里分配内存

应用:

如果需要快速访问数据,很少或不插入和删除元素,就应该用数组;相反, 如果需要经常插入和删除元素就需要用链表数据结构了

怎么遍历一个树

四种遍历概念

先序遍历:先访问根节点,再访问左子树,最后访问右子树。

后序遍历:先左子树,再右子树,最后根节点。

中序遍历:先左子树,再根节点,最后右子树。

层序遍历:每一层从左到右访问每一个节点。

每一个子树遍历时依然按照此时的遍历顺序。可以采用递归实现遍历。

冒泡排序(Bubble Sort)

算法描述:

● 比较相邻的元素。如果第一个比第二个大,就交换它们两个;

● 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;

● 针对所有的元素重复以上的步骤,除了最后一个;

● 重复步骤 1~3,直到排序完成

如果两个元素相等,不会再交换位置,所以冒泡排序是一种稳定排序算法。

代码实现:

package com.atguigu.interview.chapter02;

/**

* @author atguigu

* @since 2019/7/22

* 冒泡排序

*/

publc class BubbleSort {

/**

* @param data 被排序的数组

*/

public static void bubbleSort( int [] data) {

    int arrayLength = data.length;

    for ( int i = 1 ; i < arrayLength; i++) { //第 i 次排序

        for ( int j = 0 ; j < arrayLength - i; j++) { //从索引为 j 的数开始

            if (data[j] > data[j + 1 ]) { //相邻元素两两对比

                int temp = data[j + 1 ]; // 元素交换

                data[j + 1 ] = data[j];

                data[j] = temp;

            }

        }

        System.out.println( "第" + i + "次排序:

        \n" + java.util.Arrays.toString(data));

    }

}

public static void main(String[] args) {

    int[] data = { 3 , 44 , 38 , 5 , 47 , 15 , 36 , 26 , 27 , 2 , 46 , 4 , 19 , 50 , 4

    8 };

    System.out.println( "排序之前:\n" + java.util.Arrays.toString(data));

    bubbleSort(data);

    System.out.println( "排序之后:\n" + java.util.Arrays.toString(data));

    }

}

快速排序(Quick Sort)

算法描述:

使用分治法来把一个串(list)分为两个子串(sub-lists)。具体算法描述如下:

● 从数列中挑出一个元素,称为 “基准”(pivot);

● 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

● 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

key 值的选取可以有多种形式,例如中间数或者随机数,分别会对算法的复杂度产生不同的影响。

代码实现:

/**

* @author atguigu

* @since 2019/7/22

* 快速排序

*/

public class QuickSort {

    public static void quickSort( int [] data, int low, int high) {
        int i, j, temp, t;
        if (low > high) {
        return ;
        }

        i = low;
        j = high;

        //temp 就是基准位
        temp = data[low];
        System.out.println( "基准位:" + temp);

        while (i < j) {
            //先看右边,依次往左递减
            while (temp <= data[j] && i < j) {
            j--;
            }
    
            //再看左边,依次往右递增
            while (temp >= data[i] && i < j) {
                i++;
            }

            //如果满足条件则交换
            if (i < j) {
                System.out.println( "交换:" + data[i] + "和" + data[j]);
                t = data[j];
                data[j] = data[i];
                data[i] = t;
                System.out.println(java.util.Arrays.toString(data));
            }
        }

        //最后将基准位与 i 和 j 相等位置的数字交换
        System.out.println( "基准位" + temp + "和 i、j 相遇的位置" + data[i] + "交
        换" );
        data[low] = data[i];
        data[i] = temp;
        System.out.println(java.util.Arrays.toString(data))

        //递归调用左半数组

        quickSort(data, low, j - 1 );

        //递归调用右半数组

         quickSort(data, j + 1 , high);
    }
    public static void main(String[] args) {
        int[] data = { 3 , 44 , 38 , 5 , 47 , 15 , 36 , 26 , 27 , 2 , 46 , 4 , 19 , 50 ,                                           
        4
        8 };

        System.out.println( "排序之前:\n" + java.util.Arrays.toString(data));

        quickSort(data, 0 , data.length - 1 );

        System.out.println( "排序之后:\n" + java.util.Arrays.toString(data));
    }
}

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

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

相关文章

获取期货股票历史数据以及均线策略分析

【数据获取】银河金融数据库&#xff08;yinhedata.com&#xff09;能够获取国内外金融股票、期货历史行情数据&#xff0c;包含各分钟级别。 【搭建策略】均线策略作为一种广泛应用于股票、期货等市场的技术分析方法&#xff0c;凭借其简单易懂、操作性强等特点&#xff0c;深…

CV图像处理小工具——json文件转P格式mask

CV图像处理小工具——json文件转P格式mask import cv2 import json import numpy as np import osdef func(file_path: str) -> np.ndarray:try:with open(file_path, moder, encoding"utf-8") as f:configs json.load(f)# 检查JSON是否包含必要的字段if "…

【专题】2024年中国电商市场研究报告合集PDF分享(附原数据表)

原文链接&#xff1a;https://tecdat.cn/?p37835 在全球电商持续发展的背景下&#xff0c;中国电商市场面临新态势。 增长压力与机遇并存&#xff0c;从综合电商与直播电商发展的放缓&#xff0c;到企业 3C 数码商用品电商采购的趋势&#xff0c;以及零售业拥抱“性价比时代…

校园网站设计怎么做

校园网站设计是一项复杂而又具有挑战性的任务&#xff0c;因为它需要考虑到学校内各种不同的需求和利益。一个成功的校园网站应该能够满足学生、教职员工、家长和管理人员的需求&#xff0c;同时提供清晰、易用且富有吸引力的界面。以下是一些设计校园网站的关键方面&#xff0…

腾讯全文检索引擎 wwsearch 正式开源

背景 企业微信作为典型企业服务系统&#xff0c;其众多企业级应用都需要全文检索能力&#xff0c;包括员工通讯录、企业邮箱、审批、汇报、企业CRM、企业素材、互联圈子等。下图是一个典型的邮件检索场景。 由于过去几年业务发展迅速&#xff0c;后台检索架构面临挑战&#xf…

学霸都在用的秘密武器!盘点3款语音识别转文字软件,学习力MAX!

现在科技这么发达&#xff0c;手写笔记好像越来越不流行了。在这个什么都讲究快的时代&#xff0c;怎么又快又好地记下重要信息&#xff0c;是大家都想要的。正好&#xff0c;现在市面上有很多能把语音转换成文字的工具&#xff0c;它们特别有用&#xff0c;正在慢慢改变我们学…

pipe和pipefd

Linux 中 pipe 的详细介绍 在 Linux 中&#xff0c;pipe 是一个系统调用&#xff0c;用于创建一个管道&#xff0c;这是一种用于进程间通信&#xff08;IPC&#xff09;的机制。管道允许两个进程之间进行单向数据传输&#xff0c;通常是一个进程向管道写入数据&#xff0c;而另…

【机器学习】金融预测 —— 风险管理与股市预测

我的主页&#xff1a;2的n次方_ 在金融领域&#xff0c;机器学习&#xff08;ML&#xff09;已经成为了不可或缺的工具。金融预测&#xff0c;尤其是风险管理和股市预测&#xff0c;涉及海量数据和复杂模式的分析&#xff0c;而这些正是机器学习擅长处理的领域。通过分析历…

什么是矩阵系统,怎么选择矩阵系统,怎么oem贴牌,怎么源码搭建

一、架构设计方面 采用微服务架构 将矩阵系统拆分为多个小型的、独立的服务模块。每个微服务专注于特定的业务功能&#xff0c;如用户管理、内容发布、数据分析等。这样可以独立地开发、部署和扩展每个服务&#xff0c;而不会影响整个系统。例如&#xff0c;当用户量增加导致用…

机器学习与神经网络荣膺诺贝尔物理学奖:跨学科融合的时代来临

近日&#xff0c;2024年诺贝尔物理学奖颁发给了机器学习与神经网络领域的研究者&#xff0c;这一消息犹如一颗重磅炸弹&#xff0c;迅速在全球学术界和科技界引起了轰动和热议。这是诺贝尔物理学奖首次将桂冠授予计算机科学领域的研究者&#xff0c;标志着物理学与计算机科学的…

dvwa:文件包含、文件上传

文件包含 本地文件包含&#xff08;敏感信息泄露&#xff09;和远程文件包含&#xff08;命令执行&#xff09; 本地文件包含一般包含一些本地的敏感文件&#xff0c;如&#xff1a;/etc/passwd或/etc/shadow等 远程文件包含能使得服务器代码执行&#xff0c;如包含黑客vps的…

【纯前端实现xlsx的解析并处理成table需要的格式】

概要 xlsx纯前端导入并解析成json 整体架构流程 xlsx导入并解析成json&#xff0c;并与table中的数据进行对比&#xff0c;根据唯一标识更新对应数据项 技术名词解释 vue2xlsx 技术细节 首先下载xlsx依赖 npm install xlsx --save然后在需要导入xlsx的地方 这里主要用in…

基于模型的强化学习方法4大类灌水范式

我们都知道基于模型的强化学习&#xff0c;就是从数据中学一个环境模型。 举个例子&#xff0c;我们要控制一个马达&#xff0c;输入就是电流&#xff0c;输出就是转速。无模型强化学习就是随机采样&#xff0c;然后从数据中直接学习输入到输出的影射&#xff0c;研究重心在如…

【AAOS】Android Automotive 10模拟器源码下载及编译

源码下载 repo init -u https://android.googlesource.com/platform/manifest -b android-10.0.0_r47 repo sync -c --no-tags --no-clone-bundle 源码编译 source build/envsetup.sh lunch aosp_car_x86_64-userdebug make -j8 运行效果 emualtor Cluster Home Map All …

大模型部署-​Ollama+WebUI

Ollama&#xff08;安装包和安装文档文末领取&#xff01;&#xff09; Ollama 简介 主要特点&#xff1a; 易于使用&#xff1a;它提供了一个简洁的界面和命令行工具&#xff0c;使得用户可以方便地管理和运行不同的大语言模型。 多种模型支持&#xff1a;可以运行多种开源…

ip地址换网就不一样了吗?ip地址会因什么变动而变化

在当今数字化时代&#xff0c;IP地址作为网络设备的唯一标识&#xff0c;扮演着至关重要的角色。然而&#xff0c;对于许多用户来说&#xff0c;IP地址的变动仍然是一个充满疑惑的话题。那么&#xff0c;IP地址换网就真的不一样了吗&#xff1f;本文将深入探讨IP地址变动的因素…

力扣1~10题

题1&#xff08;简单&#xff09;. 思路&#xff1a; 因为时间复杂度小于n^2,所以不能双for遍历&#xff0c;怎么优化&#xff1f; 这里采用一个键值对的形式&#xff0c;存储nums离target的间隔和它的下标&#xff0c;只要n&#xff0c;然后再遍历nums有没有刚好是这个距离的就…

SwiftUI 在 iOS 18 中的 ForEach 点击手势逻辑发生改变的解决

概述 原本在 iOS 17 中运行良好的 SwiftUI 代码突然在 iOS 18 无法正常工作了&#xff0c;具体表现为原来视图中的的点击手势无法响应。 这是怎么回事呢&#xff1f; 且看分解&#xff01;Let’s go&#xff01;&#xff01;&#xff01;&#x1f609; 问题现象 从下面的演示…

自动驾驶系列—GPS技术在自动驾驶中的应用与挑战:全面解析

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

海量案例!点击洞察2024年工业数字孪生发展趋势

如果能在虚拟世界中完美复制出现实中的物体或系统&#xff0c;将会带来怎样的变革&#xff1f;数字孪生正是这样一种神奇的存在——它将物理世界中的设备或系统转化为精确的虚拟模型&#xff0c;通过实时数据的采集、分析与应用&#xff0c;创造出一个与“物理实体”完全对应的…