数据结构与算法-java

news/2024/5/19 16:50:41/文章来源:https://blog.csdn.net/weixin_54089340/article/details/128463996
  1. 什么是数组?
    (1)数组是计算机中最基本的数据结构之一,我们会用一些名为索引的数字来标识每项数据在数组中的位置。
    (2)大多数编程语言中索引是从0开始的。
    (3)数组在内存中是存在连续的地址中的。

  2. 数组的特点
    (1)计算机可以一步跳到任意一个内存地址上。
    (2)数组本身会记有第一个内存的地址,因此计算机知道数组的开头在哪里。
    (3)数组索引从0开始算起。

  3. 数组查找
    数组查找某个值的时候只能从前往后线性查找。

  4. 数组插入
    (1)如果只是在数组末尾插入,直接算出最后一个内存地址 插入。
    (2)如果是在开头或者结尾插入,则需要移动其他元素的位置,腾出准备插入元素的位置。

  5. 数组删除
    同数组插入相同
    (1)如果只是在数组末尾插入,直接算出最后一个内存地址 插入。
    (2)如果是在开头或者结尾插入,则需要移动其他元素的位置,腾出准备插入元素的位置。

  6. 集合
    集合是一种不允许元素重复的数据结构。

  7. 集合查找
    同数组的查找相同。数组查找某个值的时候只能从前往后线性查找。

  8. 集合插入
    在插入时要先查找,确认集合中没有要插入的元素。
    (1)如果只是在数组末尾插入,直接算出最后一个内存地址 插入。
    (2)如果是在开头或者结尾插入,则需要移动其他元素的位置,腾出准备插入元素的位置。

  9. 集合删除
    同数组删除相同。
    (1)如果只是在数组末尾插入,直接算出最后一个内存地址 插入。
    (2)如果是在开头或者结尾插入,则需要移动其他元素的位置,腾出准备插入元素的位置。

  10. 常见的排序列表

  11. 各类排序算法java实现

public class Test {public static void main(String[] args) {int[] arr= {11,2,5,7,4,0,3,6,89,5,9,8,1,45};Test ts=new Test();System.out.print("原数组:");ts.toString(arr);		long before=System.currentTimeMillis();//记录当前时间(毫秒),算法开始时间System.out.print("选择排序:");ts.selectSort(arr);
//		System.out.print("冒泡排序:");
//		ts.bubbleSort(arr);
//		System.out.print("插入排序:");
//		ts.insertSort(arr);
//		System.out.print("快速排序:");
//		ts.quickSort(arr);
//      	ts.toString(arr,0,arr.length);
//		System.out.print("归并排序:");
//		ts.mergeSort(arr);
//      	ts.toString(arr,0,arr.length);
//		System.out.print("堆排序:");
//		ts.heapSort(arr);
//		System.out.print("希尔排序:");
//		ts.shellSort(arr);
//		System.out.print("基数排序:");//鲁棒性不强,需要数组中元素都为相同的位数
//		ts.radixtSort();
//		System.out.print("计数排序:");
//		ts.countSort(arr);
//		System.out.print("桶排序:");
//		ts.bucketSort(arr);long after=System.currentTimeMillis();//算法结束时间long time=after-before;//时间差作为算法消耗时间System.out.println("算法所用时间:"+time);//打印}//选择排序 平均时间复杂度:n^2 	 不稳定  	空间复杂度:1public void selectSort(int[] arr) {for(int i=0;i<arr.length-1;i++) {int minPos=i;//假设最小值最初在0的位置for(int j=i+1;j<arr.length;j++) {
//				if(arr[i]<arr[minPos]) {
//					minPos=i;
//				}//优化minPos=arr[j]<arr[minPos] ? j:minPos;}swap(arr,i,minPos);}toString(arr);}//冒泡排序 平均时间复杂度n^2 	稳定  	空间复杂度:1public void bubbleSort(int[] arr) {for(int i=0;i<arr.length-1;i++) {for(int j=i+1;j<arr.length;j++) {if(arr[i]>arr[j]) {swap(arr,i,j);}}}toString(arr);}//插入排序 平均时间复杂度n^2 	稳定  	空间复杂度:1public void insertSort(int[] arr) {for(int i=1;i<arr.length;i++){for(int j=i;j>0;j--) {if(arr[j]<arr[j-1]) {swap(arr,j,j-1);}}}toString(arr);}//快速排序  平均时间复杂度 n log2(n)	不稳定  	空间复杂度:log2(n)public void quickSort(int[] arr,int left,int right) {if(left>=right) return;int mid=partition(arr,left,right);quickSort(arr,left,mid-1);quickSort(arr,mid+1,right);}public int partition(int[] arr ,int left,int right) {int pivot=arr[right];int l=left;int r=right;while(l<r) {while(l<=r && arr[l]<=pivot) l++;while(l<=r && arr[r]>pivot) r--;if(l<r) swap(arr,l,r);}arr[l]=pivot;return l;}//归并排序 平均时间复杂度 n log2(n)	稳定	  	空间复杂度:npublic void mergeSort(int[] arr,int left,int right) {//将基本有序的数组进行合并//java 和python内部都是用的该方法if(left>=right) return;//分成两半int mid=(right+left)/2;//左边排序mergeSort(arr,left,mid);//右边排序mergeSort(arr,mid+1,right);//左右归并merge(arr,left,mid,right);}public void merge(int[] arr,int left,int mid,int right) {int[] temp=new int[right-left+1];int i=left;int j=mid+1;int k=0;//计数,统计存入新数组的元素个数// 把较小的数先移到新数组中while(i<=mid && j<=right) {temp[k++]=arr[i]<arr[j]?arr[i++]:arr[j++];}// 把左边剩余的数移入数组 while(i<=mid) {temp[k++]=arr[i++];}// 把右边边剩余的数移入数组while(j<=right) {temp[k++]=arr[j++];}for(int m=0;m<temp.length;m++) {arr[left+m]=temp[m];}		}//堆排序 平均时间复杂度 n log2(n)	不稳定	 空间复杂度:1public void heapSort(int[] arr) {toString(arr);}//希尔排序 平均时间复杂度 n^1.3	不稳定  	空间复杂度:1public void shellSort(int[] arr) {//按照一定的间隔排序,其他地方同插入排序相同
//		int gap=4;//设定初始间隔      ——》增加for循环,优化代码int h=1;while(h<=arr.length/3) {h=h*3+1;}for(int gap=h;gap>0;gap=(gap-1)/3) {for(int i=gap;i<arr.length;i++) {for(int j=i;j>0;j--) {if(arr[j]<arr[j-1])swap(arr,j,j-1);}}}toString(arr);}//基数排序平均时间复杂度 n+k	稳定  	空间复杂度:n+kpublic void radixtSort() {//待完善,有bugint[] arr= {412,240,115,305,430,124,11,25};int[] result=new int[arr.length];//先求最高位数int max=arr[0];//初始最大值int maxIndex=0;//初始化最大值位数//获取最大值for (int c=0;c<arr.length;c++) {if(max<arr[c]) {max=arr[c];}}//获取最大值位数while(max!=0) {max=max/10;maxIndex++;}for(int i=0;i<maxIndex;i++) {int devision=(int)Math.pow(10, i);int[] count=new int[10];for(int j=0;j<arr.length;j++) {int num=arr[j]/devision%10;count[num]=count[num]+1;//存储每个元素的位数}for(int m=1;m<count.length;m++) {count[m]=count[m]+count[m-1];}for(int n=arr.length-1;n>=0;n--) {int num=arr[n]/devision%10;result[--count[num]]=arr[n];}	}toString(result);}//计数排序平均时间复杂度 n+k	稳定  	空间复杂度:n+kpublic void countSort() {//同基数排序不同,鲁棒性不强int[] arr= {5,2,1,6,9,4,5};int[] result=new int[arr.length];int[] count=new int[10];for(int i=0;i<arr.length;i++) {count[arr[i]]++;}for(int i=1;i<count.length;i++) {count[i]=count[i]+count[i-1];}for(int i=arr.length-1;i>=0;i--) {result[--count[arr[i]]]=arr[i];}toString(result);}//桶排序平均时间复杂度 n+k		稳定  	空间复杂度:n+kpublic void bucketSort(int[] arr) {toString(arr);}//打印数组函数public void toString(int[] arr) {for (int i=0;i<arr.length;i++) {System.out.print(arr[i]);if(i<arr.length-1) {System.out.print(",");}else {System.out.println();}}}//转化函数public void swap(int[] arr,int i,int j) {int temp=arr[i];arr[i]=arr[j];arr[j]=temp;}
}

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【真干货】Activiti7工作流如何使用?看这里

一. 前言 近日文哥有个毕业学员在公司开发时遇到了工作流的相关业务场景。在这里&#xff0c;文哥给大家精心准备了以Activiti为代表的工作流简单使用教程&#xff0c;希望能给有需要的小伙伴们一些帮助。下面我们就来开始介绍Activiti工作流的基本使用情况。 二. Activiti工…

常见的5种数据分析方法有哪些?

看大家介绍了那么那么多的数据分析方法&#xff0c;但不同的数据分析方法使用场景不同&#xff0c;A常用的B不一定常用。 所以这篇只介绍5种基于逻辑层面的&#xff0c;几乎人人都会用的数据分析方法。 先来分享一下数据分析6大步骤&#xff1a; 按照这6个步骤&#xff0c;结合…

Hadoop 的基础知识

Hadoop 的基础知识1. Hadoop 简介2. Hadoop 的发展简史3. Hadoop 现状4. Hadoop 特性优点5. Hadoop 发行版本6. Hadoop 架构变迁7. Hadoop 集群集体概念1. Hadoop 简介 Hadoop 官网: https://hadoop.apache.org/ Apache Hadoop 软件库是一个框架, 是 Apache 软件基金会的一款开…

SpringBoot 自动装配原理,一文掌握!|原创

本文详细讲解了 SpringBoot 自动装配原理&#xff0c;可以直接拉到最后看总结。由于 Spring 源码比较复杂&#xff0c;是需要一些基础的。如果有不懂的地方&#xff0c;欢迎提问&#xff01;点击上方“后端开发技术”&#xff0c;选择“设为星标” &#xff0c;优质资源及时送达…

【微信小程序项目的基本组成结构】

项目的基本组成结构 ├── app.js # 小程序的逻辑文件 ├── app.json # 小程序的配置文件 ├── app.wxss # 全局公共样式文件 ├── pages # 存放小程序的各个页面 │ ├── index # index页面 │ │ ├── index.js # 页面逻辑 │ │ ├── index.wxml # 页面结构 │…

亿级流量的互联网项目如何快速构建?手把手教你构建思路

一. 大流量的互联网项目 1.项目背景 索尔老师之前负责的一个项目&#xff0c;业务背景是这样的。城市的基础设施建设是每个城市和地区都会涉及到的&#xff0c;如何在基建工地中实现人性化管理&#xff0c;是当前项目的主要诉求。该项目要实现如下目标&#xff1a; 工地工人的…

2022年底了,你们公司还好吗?我这里不太好

以下这些也是和几个朋友聊天的时候慢慢聊出来的&#xff0c;不一定真实啊&#xff0c;当做大家开发累了以后的一点调味剂吧 一、宇宙厂 1.宇宙人员成本优化计划&#xff0c;随着各个业务确认了优化目标&#xff0c;将在接下来陆续开展。 某中台确认了指标&#xff0c;将在“在职…

【蓝桥杯备赛系列 | 简单题】素数判断 字符串输入输出

&#x1f935;‍♂️ 个人主页: 计算机魔术师 &#x1f468;‍&#x1f4bb; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 蓝桥杯竞赛专栏 | 简单题系列 &#xff08;一&#xff09; 作者&#xff1a; 计算机魔术师 版本&#xff1a; 1.0 &#xff08…

搭建免费内网穿透

1&#xff0c;参考&#xff1a; https://news.cndns.com/ArticlesDetail/articlesdel/id/8654https://news.cndns.com/ArticlesDetail/articlesdel/id/8654 2&#xff0c;搭建Ngrok 官网&#xff1a; https://www.ngrok.cc/https://www.ngrok.cc/ &#xff08;1&…

[网鼎杯 2020 白虎组]PicDown(任意文件读取)

打开界面发现有一个get传参然后&#xff0c;尝试任意文件读取漏洞&#xff0c;/etc/passwd看一下,提示下载了一个jpg图片然后 打不开只能用 010查看一下信息 看来是猜对了&#xff0c;然后 如果日记没删掉可以查看历史记录 .bash_history呃呃呃差不到&#xff0c;那就看一下现…

【Lilishop商城】No4-3.业务逻辑的代码开发,涉及到:会员B端第三方登录的开发-微信小程序登录接口开发

仅涉及后端&#xff0c;全部目录看顶部专栏&#xff0c;代码、文档、接口路径在&#xff1a; 【Lilishop商城】记录一下B2B2C商城系统学习笔记~_清晨敲代码的博客-CSDN博客 全篇会结合业务介绍重点设计逻辑&#xff0c;其中重点包括接口类、业务类&#xff0c;具体的结合源代码…

第十六讲:神州交换机访问控制列表的配置

访问控制列表ACL&#xff08;Access Control Lists&#xff09;数据定义工具&#xff0c;基于用户自行定义的数据的参数区分不同的数据流&#xff0c;是在交换机和路由器上经常采用的一种防火墙技术&#xff0c;它可以对经过网络设备的数据包根据一定规则进行过滤。它有以下一些…

#5文献学习总结--利用多级反馈排队的雾计算框架中的期限和优先级感知任务卸载

文献&#xff1a;DPTO: A Deadline and Priority-aware Task Offloading in Fog Computing Framework Leveraging Multi-level Feedback Queueing 延迟相关优先级感知卸载&#xff08;DPTO&#xff09;策略&#xff0c;基于任务的最后期限为每个任务分配优先级&#xff0c;并将…

C#,图像二值化(06)——全局阈值的大津OTSU算法及其源代码

1、大津OTSU算法 最大类间方差法是1979年由日本学者大津(Nobuyuki Otsu)提出的&#xff0c;是一种自适应阈值确定的方法&#xff0c;又叫大津法&#xff0c;简称OTSU&#xff0c;是一种基于全局的二值化算法&#xff0c;它是根据图像的灰度特性,将图像分为前景和背景两个部分。…

rocketmq 实战问题汇总

rocketmq 实战过程会遇到这样或者那样的问题&#xff0c;今天我们专门抽出一篇文章来分析一下汇总一下&#xff0c;避免以后踩同样的坑&#xff1a; 1、找不到JDK的问题&#xff1a; 综合分析&#xff0c;是因为JDK安装的目录有空格导致的&#xff1a;Program Files 两个单词之…

YOLO-V5 系列算法和代码解析(三)—— 训练数据加载

文章目录调试准备Debug 设置代码修改调试数据代码运行逻辑类初始化启动迭代器数据增强调试准备 为了便于阅读代码和打印中间变量&#xff0c;需进行调试模式下运行代码。配置平台&#xff1a;Ubuntu&#xff0c;VSCode。在上一篇博文中&#xff0c;我们简单探讨过调试的设置。在…

JavaScript手写响应式原理(详解)

响应式原理 首先我们有一个对象 const obj {name: zlk,age: 18}这个对象可能在别处被用到 比如是这样的 function foo() {const newValue obj.nameconsole.log(hello world);console.log(obj.name);}我们来改变obj对象中的name的值 obj.name zlk这时候foo()应该被重新执…

一文读懂bert结构。

最近承接了项目要复现tiny_Bert。所以在这里用文章记录自己学到的。这篇文章是前置&#xff0c;主要介绍bert原理。 下一篇文章介绍tinybert的原理和训练 模型介绍&#xff1a; BERT概述&#xff1a; 如果要介绍tinyBERT&#xff0c;首先我们需要了解BERT模型。&#xff08;了…

原神私服搭建教程 (最新版)

搭建教程 1.准备阶段 1.请先确保电脑内有这些安装环境&#xff0c;否则私服无法运行&#xff01;&#xff01;&#xff01; MongoDB Python3.8 java17 mitmproxy 没有请在群文件下载安装环境&#xff0c;安装即可。特别强调&#xff1a;java17直接放在C:\Program Files目录下即…

【Java编程进阶】方法初识

推荐学习专栏&#xff1a;Java 编程进阶之路【从入门到精通】 文章目录1. Java 方法初识2. 方法的创建与使用3. 方法的分类3.1 无参无返回值3.2 无参带返回值3.3 有参无返回值3.4 有参带返回值4. 递归方法5. 总结1. Java 方法初识 方法是组合在一起来执行操作语句的集合&#…