第三章 数组

  • 3.4 数组中涉及的常见算法

3.1 数组的概述
3.2 一维数组的使用
3.3 多维数组的使用
3.4 数组中涉及的常见算法
3.5 数组工具类的使用
3.6 数组使用中的常见异常

3.4 数组中涉及的常见算法


3.4.1数组元素的赋值

练习1:杨辉三角
使用二维数组打印一个 10 行杨辉三角

【提示】

  1. 第一行有 1 个元素, 第 n 行有 n 个元素
  2. 每一行的第一个元素和最后一个元素都是 1
  3. 从第三行开始, 对于非第一个元素和最后一个元素的元素。即:
    yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j];
public class arrayTest {public static void main(String[] args) {int[][] yanghui=new int[10][];for(int i=0;i<yanghui.length;i++) {yanghui[i]=new int[i+1];yanghui[i][0]=1;yanghui[i][i]=1;for(int j=1;j<yanghui[i].length-1;j++) {yanghui[i][j]=yanghui[i-1][j]+yanghui[i-1][j-1];}}for(int i=0;i<yanghui.length;i++) {for(int j=0;j<yanghui[i].length;j++) {System.out.print(yanghui[i][j]+" ");//不换行输出}System.out.println( );}}
}

练习二:回形数

import java.util.Scanner;public class arrayTest {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);System.out.println("输入一个数字");int len = scanner.nextInt();int[][] arr = new int[len][len];int maxX=arr.length-1;int maxY=arr.length-1;int minX=0;int minY=0;int count=1;while(minX<maxX) {for(int x=minX;x<=maxX;x++) {arr[minY][x]=count++;}minY++;for(int y=minY;y<=maxY;y++) {arr[y][maxX]=count++;}maxX--;for(int x=maxX;x>=minX;x--) {arr[maxY][x]=count++;}maxY--;for(int y=maxY;y>=minY;y--) {arr[y][minX]=count++;}minX++;}// 遍历for (int m = 0; m < arr.length; m++) {for (int n = 0; n < arr[m].length; n++) {System.out.print(arr[m][n] + "\t");}System.out.println();}   }
}

3.4.2 数组元素得最大值,最小值,平均值和总和

练习1:定义一个int型的一维数组,包含10个元素,分别赋一些随机整数,
然后求出所有元素的最大值, 最小值,和值, 平均值, 并输出出来。
要求: 所有随机数都是两位数。

int[]arr=new int[10];
for(int i=0;i<arr.length;i++) {arr[i]=(int)(Math.random()*90+10);
}
for(int i=0;i<arr.length;i++) {System.out.println(arr[i]);
}
int max=arr[0];
int min=arr[0];
int sum=0;
for(int i=0;i<arr.length;i++) {sum+=arr[i];if(arr[i]>max) {max=arr[i];}if(arr[i]<max) {max=arr[i];}
}
double avg=sum/arr.length;
System.out.println(max);
System.out.println(min);
System.out.println(sum);
System.out.println(avg);

3.4.3 数组的复制,反转和查找
数组的复制

//1.错误的复制 arr1=arr2 赋值
int[]arr1=new int[] {1,2,3,4,5,6};
int[]arr2=new int[6];
for(int i=0;i<arr1.length;i++) {System.out.print(arr1[i]+"\t");
}
System.out.println( );
arr2=arr1;
for(int i=0;i<arr2.length;i++) {if (i%2==0) {arr2[i]=0;}
}
for(int i=0;i<arr1.length;i++) {System.out.print(arr1[i]+"\t");
}
//输出:1   2   3   4   5   6
//输出:0   2   0   4   0   6
//改变arr2值,可以改变arr1,这是因为arr2和arr1指向同一个地址

将arr1保存的数组地址值赋给了arr2,使得arr1和arr2共同指向堆空间中的同一个数组实体

//数组的复制
int[] arr1, arr2;
arr1 = new int[] { 2, 3, 5, 7, 11, 13, 17, 19 };
//复制array1数组给array2
arr2 = new int[arr1.length];
for(int i=0;i<arr2.length;i++) {arr2[i]=arr1[i];
}

通过new的方式,给arr2在堆空间中新开辟了数组的空间。将arr1数组中的元素一个一个赋值到arr2数组中

数组的反转

//方法一
String[]arr1=new String[] {"aa","bb","cc","nn","vv","xx","zz"};
for(int i=0;i<arr1.length/2;i++) {String temp=arr1[i];arr1[i]=arr1[arr1.length-1-i];arr1[arr1.length-1-i]=temp;
}
for(int i=0;i<arr1.length;i++) {System.out.print(arr1[i]+"\t");
}
//方法二:
String[]arr1=new String[] {"aa","bb","cc","nn","vv","xx","zz"};
for(int i=0,j=arr1.length-1;i<j;i++,j--) {String temp=arr1[i];arr1[i]=arr1[j];arr1[j]=temp;
}

数组的查找

线性查找
方式一

//线性查找
String[]arr1=new String[] {"aa","bb","cc","nn","vv","xx","zz"};
String dest="bb";
boolean isFlag=true;
for(int i=0;i<arr1.length;i++) {if(arr1[i].equals(dest)) {System.out.print("找到了指定元素,位置为:"+i);isFlag=false;break;}
}
if(isFlag) {System.out.print("没有找到");
}

方式二

//线性查找
String[]arr1=new String[] {"aa","bb","cc","nn","vv","xx","zz"};
String dest="bb";
int i;
for(int i=0;i<arr1.length;i++) {if(arr1[i].equals(dest)) {System.out.print("找到了指定元素,位置为:"+i);break;}
}
if(i==arr1.length) {System.out.print("没有找到");
}

二分法:判断区间依次减半
前提:数组有序

int[]arr1=new int[] {-2,4,8,23,35,45,55,67,87,98};
int dest=55;
boolean isFlag=true;
int start=0;
int end=arr1.length-1;
while(start<=end) {int mid=(start+end)/2;if(dest==arr1[mid]) {System.out.print("找到了指定元素,位置为:"+mid);isFlag=false;break;}else if(dest<arr1[mid]) {end=mid-1;}else {start=mid+1;}
}
if(isFlag) {System.out.print("没有找到");
}

3.4.4 数组的排序
排序算法
衡量排序算法的优劣:1.时间复杂度2.空间复杂度 3.稳定性
十大排序算法:
选择排序:直接选择排序,堆排序
交换排序:冒泡排序,快速排序
插入排序:直接插入排序,折半插入排序,Shell排序
归并排序
桶式排序
基数排序
冒泡排序
时间复杂度: O(n^2)
排序思想:

  1. 比较相邻的元素。如果第一个比第二个大(升序),就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步
    做完后,最后的元素会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要
    比较为止。
int[]arr1=new int[] {-2,56,8,2,35,30,55,67,124,98};for(int i=1;i<arr1.length-1;i++) {for(int j=0;j<arr1.length-i;j++) {if(arr1[j]>arr1[j+1]) {int temp=arr1[j];arr1[j]=arr1[j+1];arr1[j+1]=temp;}}}
for(int i=0;i<arr1.length;i++) {System.out.print(arr1[i]+"\t");
}

快速排序
时间复杂度: O(nlogn)
排序思想:

  1. 从数列中挑出一个元素,称为"基准"(pivot),
  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准
    值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,
    该基准就处于数列的中间位置。这个称为分区(partition)操作。
  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数
    列排序。
  4. 递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好
    了。虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代
    (iteration)中,它至少会把一个元素摆到它最后的位置去。
public class arrayTest {public  static void main(String[] args) {int[]arr1=new int[] {20,80,14,-2,56,8,2,35,20,30,10,67};   int low=0;int high=arr1.length-1;Quick_short(arr1,low,high);for(int i=0;i<arr1.length;i++) {System.out.print(arr1[i]+"\t");}}//进行分区,大于arr[pivot]的在右边,小于其的在左边public static int partition(int[] arr, int low, int high) {        int pivot=low;int temp=arr[pivot];while(low<high) {while(low<high&&arr[high]>temp) {//如果右边的值一直比temp大,则high一直往中间推。当<=时,暂停high--;}//暂停之后将值赋给arr[low],开始从左边继续看if(low<high) {arr[low]=arr[high];low++;}while(low<high&&arr[low]<temp) {//如果左边的值一直比temp小,则low一直往中间推。当>=时,暂停low++;}//暂停之后将值赋给arr[high],开始从右边继续看if(low<high) {arr[high]=arr[low];high--;}       }//退出循环:low=high,交换low所在位置和pivot的值,并且返回此时low的值arr[low]=temp;return low;//返回arr[pivot]所在位置    }//递归过程public static int[] Quick_short(int[] arr,int s,int t) {if(s<t) {int i=partition(arr,s,t);Quick_short(arr,i+1,t);Quick_short(arr,s,i-1);}return arr;        }
}

分区部分的图解过程:

堆排序
堆排序(Heapsort) 是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。(大于或等于:大顶堆,小于或等于:小顶堆)
算法描述(大顶堆):
int arr=new int[]{30,60,8,40,70,12,10}
步骤1:将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,此堆为初始的无序区;

步骤2:将堆顶元素R[1]与最后一个元素R[n]交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区(Rn),且满足R[1,2…n-1]<=R[n];
步骤3:无序区(R1,R2,……Rn-1)重新建堆。然后再次将R[1]与Rn-1交换,再将(R1,R2….Rn-2)重新建堆。不断重复此过程,直到重新建堆元素为一个。

归并排序
将已有序的子序列合并,得到完全有序的序列;即先使用每个子序列有序,再使得子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。
算法描述:
步骤1:把长度为n的输入序列分成两个长度为n/2的子序列;
步骤2:对这两个子序列分别采用归并排序;
步骤3:将两个排序好的子序列合并成一个最终的排序序列。

Java尚硅谷基础笔记-day4数组-数组常见算法相关推荐

  1. Java 基础 第3阶段:高级应用——尚硅谷学习笔记(含面试题) 2023年

    Java 基础 第 3 阶段:高级应用--尚硅谷学习笔记(含面试题) 2023 年 Java 基础 第 3 阶段:高级应用--尚硅谷学习笔记(含面试题) 2023 年 第 9 章 异常处理 9.1 异 ...

  2. 尚硅谷 jQuery 笔记(张晓飞 2018)

    title: 尚硅谷 jQuery 笔记 date: 2020-11-24 21:40:50 toc: true description: jQuery是JS的一个封装的库函数集,用于DOM的CRUD ...

  3. 尚硅谷JavaSE笔记(四)

    系列文章目录 尚硅谷JavaSE笔记(一) 尚硅谷JavaSE笔记(二) 尚硅谷JavaSE笔记(三) 尚硅谷JavaSE笔记(四) 文章目录 十六.File 类与 IO 流 1.java.io.Fi ...

  4. Java尚硅谷核心知识

    Java尚硅谷核心知识 一.Java基础部分 1.1 Java语言的主要特性 1.2 Java程序运行机制及运行过程 1.2.1Java两种核心机制 1.3Java语言的环境搭建 1.3.1 为什么要 ...

  5. 尚硅谷_CSS3 笔记

    目录 什么是CSS3 选择器 基本选择器及其扩展 属性选择器 伪类与伪元素选择器 css声明的优先级 自定义字体&字体图标 复习1 新的UI方案 文本新增样式 opacity RGBA 文字阴 ...

  6. B站MySQL(尚硅谷)学习笔记

    B站MySQL基础(尚硅谷)学习笔记 最近在学习数据库技术,并且把视频中的知识点进行了汇总,字数较多,仅供参考. 会持续更新 欢迎读者提出问题与错误,一起交流~ 视频前几集所讲述的基本知识: DB:数 ...

  7. 尚硅谷springboot笔记_dubbo笔记(一、基础知识)

    文章内容参考尚硅谷dubbo文档,侵删. 官方地址:https://shimo.im/docs/T9CRVXdRD9CdjcGw/ 一.SOA和RPC介绍 1.SOA 随着互联网的发展,应用规模不断扩 ...

  8. 尚硅谷_Redis6笔记

    该博客参考尚硅谷Redis6视频资料完成,仅用于学习使用,如有侵权,请联系删除 1.NoSQL数据库简介 1.NoSQL数据库 1.NoSQL数据库概述 NoSQL(NoSQL = Not Only ...

  9. 尚硅谷vue笔记 详细讲解版(尚硅谷 天禹老师)

    视频:[尚硅谷Vue2.0+Vue3.0全套教程丨vuejs从入门到精通]https://www.bilibili.com/video/BV1Zy4y1K7SH?vd_source=10e3dfac9 ...

最新文章

  1. com/opensymphony/xwork2/spring/SpringObjectFactory.java:220:-1问题出现的原因及解决办法
  2. IOS 项目名称修改(XCODE4.6)
  3. 算法代码_Python进化算法之多目标优化与代码实战
  4. 集成开放平台标准化连接器之基于OAS3.0的API管理能力
  5. 95. 不同的二叉搜索树 II
  6. 信管 - 挣值 - 资料收集
  7. 分析师视角:2018年的数据中心3大预测
  8. java 传递bean_Java:如何将值从类/ bean传递给servlet
  9. elementUI使用checkboxgroup组件,获得value的数字集合,而不是label的文字集合 - 解决篇
  10. 国产Model 3高性能版规格公布:充电15分钟续航250公里
  11. Andriod 从源码的角度详解View,ViewGroup的Touch事件的分发机制
  12. 【BZOJ】1497: [NOI2006]最大获利 最大权闭合子图或最小割
  13. (翻译)锚定效应(Anchoring)
  14. php amr mp3,php实现微信语音amr文件在线播放方法
  15. 学校校车运营各项安全管理制度_学校校车安全管理制度.doc
  16. 阅读《迁移学习简明手册》总结(二)
  17. 关于QRCode生成二维码(背景图、Logo)
  18. 火爆业界的明星, 下一代存储技术的先行: NVDIMM (下篇)
  19. python农历_用python计算农历/阴历假日
  20. 信用支付一路狂奔,未来这块蛋糕该怎么吃

热门文章

  1. Ubuntu16.04下安装有道翻译
  2. android画机器人,cdr怎么绘制安卓小人?cdr安卓机器人制作教程
  3. 2021-09-14指标计算
  4. Java中Set Map List 的区别
  5. 《光之圣境放置次元》1.26上线链游玩家|放置挂机、重塑神域
  6. oracle练习题(二)
  7. 下载较旧版本的VS visual studio
  8. VMware : 处理器数量和每个处理器的核心数量
  9. PGA Tour PRize Money(Uva 207)
  10. 模拟cmos集成电路(4)