数据结构与算法-java

news2024/11/20 13:44:40
  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 	 不稳定  	空间复杂度:1
	public 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 	稳定  	空间复杂度:1
	public 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 	稳定  	空间复杂度:1
        public 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)	稳定	  	空间复杂度:n
	public 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)	不稳定	 空间复杂度:1
	public void heapSort(int[] arr) {
		toString(arr);
	}
	//希尔排序 平均时间复杂度 n^1.3	不稳定  	空间复杂度:1
	public 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+k
	public void radixtSort() {
		//待完善,有bug
		int[] 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+k
	public 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+k
	public 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.coloradmin.cn/o/124478.html

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

相关文章

如何打造一个流式数据湖

Flink将数据写入到 hudi 准备阶段 启动hadoop集群&#xff08;单机模式&#xff09; ./sbin/start-all.shhdfs离开安全模式 hdfs dfsadmin -safemode leave启动hive 后台启动元数据 ./hive --service metastore &启动hiveserver2 ./hiveserver2 &执行sql语句之前…

fpga实操训练(ip rom)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 altera的fpga本身自带了rom的ip&#xff0c;使用起来也十分方便。实际开发中&#xff0c;使用rom的场景也很多&#xff0c;比如一些默认的配置文件…

TensorFlow之回归模型-2

1 基本概念 回归模型 线性 线性模型 非线性模型 线性回归 逻辑回归 Log Loss&#xff08;损失函数&#xff09; 分类临界值 2 效率预测 回归问题是预测一个持续的值&#xff0c;主要是用于解决不确定性的问题&#xff0c;例如&#xff0c;一个商品在未来可能的价格或…

CMAKE_INSTALL_PREFIX

一、定义 CMAKE_INSTALL_PREFIX为cmake的内置变量&#xff0c;用于指定cmake执行install命令时&#xff0c;安装的路径前缀。Linux下的默认路径是/usr/local &#xff0c;Windows下默认路径是 C:/Program Files/${PROJECT_NAME} 二、用…

dcloud如何苹果ios系统真机测试-HBuilderX真机运行ios测试

dcloud如何运行到IOS真机测试 1&#xff0c;下载安装iTunes 安装完毕后重新打开HBuilderX 2&#xff0c;点击运行真机 将iPhone 与电脑进行链接&#xff0c;点信任&#xff0c; 运行-运行到手机或模拟器-运行到IOS APP 基座 安装过itunes就会有显示&#xff0c;但是这里还有…

进程的学习 —— Linux下的进程

目录前言1 认识进程1.1 进程的概念1.2 进程的管理1.3 查看进程的两种方法1.4 getpid、getppid和fork函数2 进程状态2.1 普遍概念下的进程状态2.2 Linux下的进程状态2.2.1 测试Linux的各种进程状态2.2.2 僵尸进程2.3 孤儿进程3 进程切换与进程优先级3.1 并行、并发3.2 进程切换3…

kafka和sparkStreaming

1、Kafka 1、kafka集群架构 producer 消息生产者&#xff0c;发布消息到Kafka集群的终端或服务 broker Kafka集群中包含的服务器&#xff0c;一个borker就表示kafka集群中的一个节点 topic 每条发布到Kafka集群的消息属于的类别&#xff0c;即Kafka是面向 topic 的。 更通俗…

HDFS 常用命令

一、HDFS常用命令 1、查看版本 hdfs version 2、创建 HDFS 文件系统目录。 格式&#xff1a; hdfs dfs -mkdir /user/dir1 3、列出目录下的所有文件 类似 Linux Shell 的 ls 命令。用它可以列出指定目录下的所有文件 hdfs dfs -ls /user/ 4、把本地文件系统文件和目录拷贝…

整合Tkinter GUI界面的古诗词词云生成

Python语言提供的wordcloud词云功能&#xff0c;使文本数据的可视化&#xff0c;简单而美丽。但网上的大多数词云生成功能&#xff0c;多半没有可交互的GUI界面&#xff0c;使用起来稍觉不便。笔者结合网上的中文词云功能&#xff0c;以唐诗三百首&#xff0c;宋词三百首&#…

拟合算法(模型+代码)

拟合的结果是得到一个确定的曲线 最小二乘法的几何解释&#xff1a; argmin 存在参数k&#xff0c;b使括号里的值最小 第一种有绝对值&#xff0c;不易求导&#xff08;求导在求最小值&#xff09;&#xff0c;计算较为复杂&#xff1b;所以我们往往使用第二种定义&#xff0…

什么软件可以录屏?这3款宝藏录屏软件,码住收藏

当我们处理剪辑视频时&#xff0c;我们需要使用到很多素材。有些素材我们可以直接从电脑网上进行下载。但有些素材我们在网上无法进行下载&#xff0c;这个时候就需要使用录屏软件进行录屏。什么软件可以录屏&#xff1f;今天小编向您分享3个宝藏录屏软件&#xff0c;赶紧码住收…

jmeter基础使用方法

文章目录一 配置环境变量二 Jmeter默认语言设置三 启动线程组的创建发送http请求数据报告一 配置环境变量 设置JMETER_HOME,及jemeter解压目录。 设置CLASSPATH,此处分别配置ApacheJMeter_core.jar和jorphan.jar所在位置。 关于环境变量配置多个值&#xff0c;在多个参数中间…

动态规划——状态压缩dp

文章目录概述状态压缩使用条件状压dp位运算棋盘&#xff08;基于连通性&#xff09;类问题概述例题蒙德里安的梦想小国王玉米田炮兵阵地集合类问题概述例题最短Hamilton路径愤怒的小鸟总结概述 状态压缩 状态压缩就是使用某种方法&#xff0c;简明扼要地以最小代价来表示某种…

MySQL 进阶篇2.0 存储过程 触发器 锁 InnoDB引擎

45.存储过程-介绍 46.存储过程-基本语法 -- 查看 select * from information_sc

Python中import语句用法详解

一. 什么是模块&#xff08;module&#xff09;&#xff1f; 在实际应用中&#xff0c;有时程序所要实现功能比较复杂&#xff0c;代码量也很大。若把所有的代码都存储在一个文件中&#xff0c;则不利于代码的复用和维护。一种更好的方式是将实现不同功能的代码分拆到多个文件…

案例丨多元业态管理服务厂商如何走通数字化转型之路

对于多元业态管理服务厂商来说&#xff0c;不同业态客户的使用习惯不一样&#xff0c;从而导致服务过程中的服务有所区别&#xff0c;是这类服务厂商数字化转型的核心需求。下面就以全国领先的阳光智博为例&#xff0c;看下他们是怎样数字化转型的。 一、企业介绍 阳光智博服务…

ASEMI整流二极管A7二极管和M7二极管能代换吗

编辑-Z A7二极管和M7二极管不仅外观封装很像&#xff0c;各项参数也是非常接近的&#xff0c;那么A7二极管和M7二极管能代换吗&#xff1f;我们先来看看他们的详细参数对比&#xff1a; A7二极管参数&#xff1a; 型号&#xff1a;A7二极管 封装&#xff1a;SOD-123 最大重…

Docker- 7.1、跨主机网络-macvlan

一、macvlan介绍 macvlan 本身是 linxu kernel 模块&#xff0c;其功能是允许在同一个物理网卡上配置多个 MAC 地址而实现虚拟多块网卡&#xff0c;即多个 interface&#xff0c;每个 interface 可以配置自己的IP。macvlan 本质上是一种网卡虚拟化技术。macvlan 的最大优点是性…

教你这样找到Mac“其他”文件并删除它

当我们通过「关于本机」>「存储空间」查看硬盘的空间占用情况时。系统会将存储空间根据不同文件类别所占的空间大小显示在条状图上&#xff0c;大部分类型看文字都比较好理解&#xff0c;但对于“其他”这一类很多小伙伴都感觉很困惑&#xff0c;会产生一些问题如&#xff1…

如何在PPT中嵌入交互式图表?LightningChart助力炫酷展示

我们在PPT演示文稿中嵌入图表很容易&#xff0c;但嵌入交互式图表似乎就没听说过了&#xff0c;接下来我们就一起来看看通过交互式图表在PPT中展示病人心跳的效果&#xff1a; PPT中展示病人心跳下方是一个实时地图在PPT中的展现实例 LightningChart2以上在PPT中展示实时交互的…