数据结构 数组中常见的算法(笔记十)
目录
- 一、数据结构
- 二、数组中涉及的常见算法
- (1)杨辉三角
- (2) 求数值型数组中元素的最大值、最小值、平均数、总和等
- (3).数组的复制、反转、查找(线性查找、二分法查找)
- a、数组的复制
- 数组的反转,查找
- (4)、数组元素的排序算法
- 冒泡排序
- 快速排序
- 各种内部排序方法性能比较
- 三、Arrays工具类的使用
- 四、数组使用中的常见异常
一、数据结构
1.数据与数据之间的逻辑关系:维合、一对一、一对多、多对多
2.数据的存储结构:
线性表:顺序表(比如:数组)、链表、栈、队列
树形结构:二叉树
图形结构:
二、数组中涉及的常见算法
1.数组元素的赋值(杨辉三角、回形数等)
2.求数值型数组中元素的最大值、最小值、平均数、总和等
3.数组的复制、反转、查找(线性查找、二分法查找)
4.数组元素的排序算法
(1)杨辉三角
(2) 求数值型数组中元素的最大值、最小值、平均数、总和等
*** @Description:算法的考查:求数值型数组中元素的最大值、最小值、平均数、总和等* 定义一个int型的一维数组,包含1日个元素,分别赋一些随机整数,* 然后求出所有元素的最大值,最小值,和值,平均值,并输出出来。* 要求:所有随机数都是两位数。 $* @Author: dyq* @Date: $*/
public class Test05 {public static void main(String[] args) {int[] arr = new int[10];for (int i =0;i<arr.length;i++){arr[i]= (int)(Math.random()*(99-10+1)+10);}//遍历for (int i =0;i<arr.length;i++){System.out.println(arr[i]);}//求数组元素的最大值int max =arr[0];for (int i=0;i< arr.length;i++){if(max<arr[i]){max=arr[i];}}System.out.println("最大值为:"+max);//求最小值int min =arr[0];for (int i=0;i< arr.length;i++){if(min>arr[i]){min=arr[i];}}System.out.println("最小值为:"+min);//求和int sum =0;for (int i =0;i<arr.length;i++){sum+=arr[i];}System.out.println("总和为:"+sum);//数组元素的平均数double avg = sum/arr.length;System.out.println("平均值为:"+avg);}
}
(3).数组的复制、反转、查找(线性查找、二分法查找)
a、数组的复制
数组的赋值:
public class Test06 {public static void main(String[] args) {int[] arry1,arry2;arry1 = new int[]{2,3,5,7,11,13,17,19};//显示arry1的内容System.out.print("第一次输出arry1:");for (int i=0;i<arry1.length;i++){System.out.print(arry1[i]+"\t");}//赋值arry2变量arry1 不能称作数组的复制arry2=arry1; //array1和array2地址值相同,都指向了堆空间的唯一的一个数组实体。//修改arry2中的偶数索引元素,使其等于索引值(如array[0]=0,array[2]=2)。打印出array1。for (int i=0;i<arry2.length;i++){if(i % 2==0){arry2[i]=i;}}System.out.print("第二次输出arry1:");for (int i=0;i<arry1.length;i++){System.out.print(arry1[i]+"\t");}}
}
输出结果:
第一次输出arry1:2 3 5 7 11 13 17 19
第二次输出arry1:0 3 2 7 4 13 6 19
数组的复制:
public class Test07 {public static void main(String[] args) {int[] arry1,arry2;arry1 = new int[]{2,3,5,7,11,13,17,19};//显示arry1的内容System.out.print("第一次输出arry1:");for (int i=0;i<arry1.length;i++){System.out.print(arry1[i]+"\t");}//数组的复制arry2 = new int[arry1.length];for (int i =0;i<arry2.length;i++){arry2[i]=arry1[i];}//修改arry2中的偶数索引元素,使其等于索引值(如array[0]=0,array[2]=2)。打印出array1。for (int i=0;i<arry2.length;i++){if(i % 2==0){arry2[i]=i;}}System.out.print("第二次输出arry1:");for (int i=0;i<arry1.length;i++){System.out.print(arry1[i]+"\t");}}
}
第一次输出arry1:2 3 5 7 11 13 17 19
第二次输出arry1:2 3 5 7 11 13 17 19
数组的反转,查找
public class Test08 {public static void main(String[] args) {String[] arr = new String[]{"哥哥", "姐姐", "弟弟", "妹妹", "爸爸", "妈妈"};//数组的复制String[] arr1 = new String[arr.length];for (int i = 0; i < arr1.length; i++) {arr1[i] = arr[i];}//数组的反转//方式一
// for (int i =0 ;i<arr.length/2;i++){// String temp = arr[i];
// arr[i] = arr[arr.length-i-1];
// arr[arr.length-i-1]= temp;
// }//方法二for (int i = 0, j = arr.length - 1; i < j; i++, j--) {String temp = arr[i];arr[i] = arr[j];arr[j] = temp;}//遍历System.out.println("反转数组:");for (int i = 0; i < arr.length; i++) {System.out.println(arr[i] + "\t");}//查找(或收索)//线性查找String dest = "姐姐";boolean isFlag = true;System.out.println("查找元素:");for (int i = 0; i < arr.length; i++) {if (dest.equals(arr[i])) {System.out.println("找到指定元素" + dest + ",位置为:" + i);isFlag = false;break;}}if (isFlag) {System.out.println("很遗憾没有找到!");}//二分法查找 前提:所要查找的数组必须有序。int[] arr2 = new int[]{ -99,-89,-1,12, 23, 44,45,66,67,98,100};int dest1 =-99;int head = 0;//初始的首索引int end = arr2.length - 1;//初始的末索引boolean isFlag1 = true;while (head <= end) {int middle = (head + end) / 2;if (dest1 == arr2[middle]) {System.out.println("找到了指定的元素,位置为:" + middle);isFlag1 = false;break;} else if (arr2[middle] > dest1) {end = middle- 1;} else {//arr2[middle]<dest1head = middle + 1;}}if (isFlag1) {System.out.println("很遗憾没有找到!");}}
}
结果:
反转数组:
妈妈
爸爸
妹妹
弟弟
姐姐
哥哥
查找元素:
找到指定元素姐姐,位置为:4
找到了指定的元素,位置为:0
(4)、数组元素的排序算法
算法的五大特征:
说明:满足确定性的算法也称为:确定性算法。现在人们也关注更广泛的概念,例如考虑各种非确定性的算法,如并行算法、概率算法等。另外,人们也关注并不要求终止的计算描述,这种描述有时被称为过程( procedure ) 。
冒泡排序
public class BubbleSortTest {public static void main(String[] args) {int[] arry = new int[]{43,32,21,4,56,77,89,900};//冒泡排序for (int i =0;i<arry.length-1;i++){for (int j =0;j<arry.length-1-i ; j++){if (arry[j]>arry[j+1]){int temp = arry[j];arry[j] = arry[j+1];arry[j+1] = temp;}}}for (int i =0;i<arry.length;i++){System.out.println("冒泡排序:"+arry[i]+"\t");}}
}
结果:
4
21
32
43
56
77
89
900
快速排序
public class QuickSort {private static void swap(int[] data, int i, int j) {int temp = data[i];data[i] = data[j];data[j] = temp;}private static void subSort(int[] data, int start, int end) {if (start < end) {int base = data[start];int low = start;int high = end + 1;while (true) {while (low < end && data[++low] - base <= 0) ;while (high > start && data[--high] - base >= 0) ;if (low < high) {swap(data, low, high);} else {break;}}swap(data, start, high);subSort(data, start, high - 1);//递归调用subSort(data, high + 1, end);}}public static void quickSort(int[] data){subSort(data,0,data.length-1);}public static void main(String[] args) {int[] data = { 9, -16, 30, 23, -30, -49, 25, 21, 30 };System.out.println("排序之前:\n" + java.util.Arrays.toString(data));quickSort(data);System.out.println("排序之后:\n" + java.util.Arrays.toString(data));}
}
结果:
排序之前:
[9, -16, 30, 23, -30, -49, 25, 21, 30]
排序之后:
[-49, -30, -16, 9, 21, 23, 25, 30, 30]
各种内部排序方法性能比较
三、Arrays工具类的使用
代码实例:
import java.util.Arrays;/*** @Description: $* @Author: dyq* @Date: $*/
public class ArraysTest {public static void main(String[] args) {int[] arr1 = new int[]{1,2,3,4};int[] arr2 = new int[]{1,3,2,4};//1 boolean equals(int[] a,int[] b) 判断两个数组是否相等。boolean equals = arr1.equals(arr2);System.out.println(equals);//2 String toString(int[] a) 输出数组信息。System.out.println(Arrays.toString(arr1));//3 void fill(int[] a,int val) 将指定值填充到数组之中。Arrays.fill(arr1,10);System.out.println(Arrays.toString(arr1));//4 void sort(int[] a) 对数组进行排序。Arrays.sort(arr2);System.out.println(Arrays.toString(arr2));//5 int binarySearch(int[] a,int key) 对排序后的数组进行二分法检索指定的值。int[] arry1 = new int[]{2,3,5,8,11,13,17,19};int a = Arrays.binarySearch(arry1,19);System.out.println(a);}
}
结果:
false
[1, 2, 3, 4]
[10, 10, 10, 10]
[1, 2, 3, 4]
7
四、数组使用中的常见异常
public class ArrayException {public static void main(String[] args) {int[] arr = new int[]{1,2,3,4};// for (int i=0;i <=arr.length;i++){// System.out.print(arr[i]+"\t"); //报异常ArrayIndexOutOfBoundsException数组角标越界异常
// }// System.out.println(arr[-1]);//报异常ArrayIndexOutOfBoundsException数组角标越界异常//空指针异常java.lang.NullPointerException//情况一:
// int[] arr1 = new int[]{1,2,3,4,5};
// arr1= null;
// System.out.println(arr1[0]);//情况二:
// int[][] arr2 =new int[4][];
// System.out.println(arr2[0]); //null//情况三:String[] arr3 = new String[]{"AA","BB","CC"};arr3[0]=null;System.out.println(arr3[0].toString());}
}
数据结构 数组中常见的算法(笔记十)相关推荐
- 强化学习经典算法笔记(十四):双延迟深度确定性策略梯度算法TD3的PyTorch实现
强化学习经典算法笔记(十四):双延迟深度确定性策略梯度算法TD3的PyTorch实现 TD3算法简介 TD3是Twin Delayed Deep Deterministic policy gradie ...
- php查找二维数组下标,PHP实现二维数组中的查找算法小结
本文实例讲述了PHP实现二维数组中的查找算法.分享给大家供大家参考,具体如下: 方法1:silu从左下角最后一行的第一个元素开始,遍历.如果小于target 则遍历该行的所有元素,找到结束.如果大于继 ...
- php二维数组中的查找,PHP实现二维数组中的查找算法小结
本文实例讲述了PHP实现二维数组中的查找算法.分享给大家供大家参考,具体如下: 方法1:silu从左下角最后一行的第一个元素开始,遍历.如果小于target 则遍历该行的所有元素,找到结束.如果大于继 ...
- android studio插入数据表中没有_学Java能拿高薪吗 Java中常见排序算法有哪些
学Java能拿高薪吗?Java中常见排序算法有哪些?作为老牌编程语言,Java拥有广阔的市场占有率,几乎90%以上的大中型互联网应用系统在服务端开发都会首选Java.为了加入到Java这一高薪行业,很 ...
- 学数学建模算法对计算机的好处,数学建模中常见十种算法 (期末论文).doc
数学建模中常见十种算法 (期末论文) 数 学 系 毕 业 论 文 论文 (设计)题目: 数学建模中常见的十种算法 姓 名 黄小芬______ 学 号 100501313 专 业 数学与应用数学 班 级 ...
- 强化学习经典算法笔记(十二):近端策略优化算法(PPO)实现,基于A2C(下)
强化学习经典算法笔记(十二):近端策略优化算法(PPO)实现,基于A2C 本篇实现一个基于A2C框架的PPO算法,应用于连续动作空间任务. import torch import torch.nn a ...
- 算法设计和数据结构学习_2(常见排序算法思想)
一般约定我们是按照从小到大的顺序排序. 按照向量的形式来参考排序中数组元素的相对位置,行向量中最左边为数组的第一个元素,且称为前面.列向量中最上面的元素为数组的第一个元素,也是称为前边. 对常见的排序 ...
- 前端面试中常见的算法问题
虽说我们很多时候前端很少有机会接触到算法.大多都交互性的操作,然而从各大公司面试来看,算法依旧是考察的一方面.实际上学习数据结构与算法对于工程师去理解和分析问题都是有帮助的.如果将来当我们面对较为复杂 ...
- JS面试中常见的算法题
js除了基础知识以外,算法也是挺重要的.因此特意整理了一些常见的算法题,希望大家有帮助. 1.验证一个数是否是素数 1.如果这个数是 2 或 3,一定是素数: function isPrime(num ...
最新文章
- html5 手机上传图片
- mysql取消外码约束_MySQL 关闭子表的外键约束检察方法
- HDU 2125 Local area network
- OpenCV手写数字字符识别(基于k近邻算法)
- 动态规划 dynamic programming
- java中select的用法_mybaties中select用法,以及常用增删改查
- Python全栈开发:web框架们
- docker探索-windows10 docker 使用 mysql(二)
- Codeforces Good bye 2015 B. New Year and Old Property dfs 数位DP
- c语言课程设计报告 数独,C语言课程设计报告数独.pdf
- 使用代码控制小米智能插座
- 【神经网络与深度学习-TensorFlow实践】-中国大学MOOC课程(七)(数字图像基础))
- java affinity_sched_setaffinity()如何工作?
- 通讯录教程】如何大批量导入手机号码到手机的通讯录,下面教你方法
- UE4如何贴混合贴图_UE4助力高品质移动游戏(1)-优化篇
- 为什么大家都在用 PDF? PDF 文档怎么修改?
- 拼多多商家制作商品详情页的技巧?
- Windows 七种截图方式 快捷键 系统自带 工具软件
- Web端如何引用iconfont,iconfont所有的引用方式。
- 19.2 NESMA 唯一和非唯一搜索条件的组合案例分析
热门文章
- 2022ICPC网络赛第一场-A 01 Sequence
- 敏捷其实很简单3---敏捷方法之scrum
- Prometheus配置监控ip、端口连通,get、post接口连通和状态码
- 计算机专业考研英语二国家线多少分,2017考研英语二单科国家线是多少分
- 计算机网络信息中心博士毕业要求,科学网—关于东南大学计算机博士毕业条件 - 董仕的博文...
- 最近作项目萌发的疑问
- 正式推出Linux Kernel内核5.19
- UE4 回合游戏项目 16- 控制玩家
- 使用Selenium来爬取网页内容
- Python编程:多线程断点下载文件