目录
二维数组
名词:长度,二维数组中一维数组的个数。(所以对二维数组直接使用length,得到的是一维数组的个数)
元素:一维数组
下标(索引):一维数组在二维数字中的位置
定义:
1.声名
数据类型 [ ] [ ] 数组名称;
2.创建 动态创建
public class test{
public static void main(String[] args) {
String[][] nemaStrings=new String[][] {//数据类型[][] 数组名=new 数据类型[][]{值};
{"火旺","白淼","高志坚"},//
{"北风","骰子","红中"},//
{"李岁","季灾","九条"},//
};
int[][] sum=new[3][3];//数据类型[][]数组名=new[x][y]//x:一维数组的个数,y:一维数组元素中的个数
}
}
特点:可以声名与创建分开,也可以同时进行
静态创建:
int [][] sum= {
{1,2,3},
{4,5,6},
{7,8,9},
};
特点:声名与创建必须同时进行
3.操作
改:
String[][]name=new String[][] {
{"a","b","c","d"},
{"e","f","g","h"},
{"i","j","k","l"},
};
name[1][2]="4";//改指定位置数据
数组名[下标1][下标2]=值;1是第几行,2是第几列
String[][]name=new String[][] {
{"a","b","c","d"},
{"e","f","g","h"},
{"i","j","k","l"},
};
name[1][2]="4";
String[] name2=new String[] {"1","2","3","4"};//定义一个一维数组
name[0]=name2;//可以改变二维数组中某一个一维数组,也就是整行
查找:能改也能查,查找和改值的思路一致
特殊的,当二维数组只出现首个下标表示的是数组中的一维数据。
遍历的思路是两次for循环
int [][] sum=new int[][] {
{1,2,3},
{4,5,6},
{7,8,9},
};
for(int i=0;i<sum.length;i++) {
for(int j=0;j<sum[1].length;j++) {
System.out.print("\t"+sum[i][j]);
}
System.out.println();
}
System.out.println("--------");
for (int[] is : sum) {//外层(元素类型 元素变量:遍历对象)先把包含一维数组
for (int is2 : is) {//内层遍历 先看作一维数组,所以元素类型为int[]
System.out.print(" "+is2);//
}
System.out.println();
}
}
}
两者都可成功。
练习:画一个杨辉三角
有以下性质,斜边都为1,元素值为上排相邻的数字之和
将其列为直角三角形,容易看出在二维坐标中,
H[j][k]=H[j-1][k-1]+H[j-1][k];
public class Dome2 {
public static void main(String[] args) {
int[][] yangH=new int[10][10];// 首先定义需要创建的三角大小,10为其两边
for(int i=0;i<yangH.length;i++) {
yangH[i][0]=1;//给最左边一排赋值为0
for(int c=1;c<yangH[i].length;c++) {
yangH[i][c]=0;//给除最左边的值都赋值为0
}
}
for(int j=1;j<yangH.length;j++) {//不能从元素yangH[i][0]或yangH[0][j]开始,会与公式相悖越界
for(int k=1;k<yangH[j].length;k++)//从下标[1][1]的元素开始
{
yangH[j][k]=yangH[j-1][k-1]+yangH[j-1][k];//带入公式
}
}
for(int a=0;a<yangH.length;a++) {
for(int b=0;b<yangH[a].length;b++) {
if(yangH[a][b]!=0)// 过滤掉0的元素
System.out.print("\t"+yangH[a][b]);//输出打印
}
System.out.println("\n");
}
}
}
算法:
软件就是算法+数据结构,
优点:可以提高计算机运算效率
例如
//原来的
int sum = 0;
for(int i = 1; i < 101; i++){
sum = sum + i;
}
System.out.println(sum);
数学公式:(首项+尾项)*项数/2
int sum = (1+100)*100/2
可以看到此公式大大增加了计算机运作效率
如何判断算法是否优秀:
时间复杂度:代码执行的时长,越短越好
空间复杂度:代码在运行占用的内存,内存越少越好
常见排序算法
冒泡排序
思路,让一串数相邻之间的交换,第一遍遍历让最小的交换到最右或最左边,接下来把剩下的看为一个整体,继续交换。
public class maopao {
public static void main(String[] args) {
int[]arr=new int[] {10,9,88,12,7,76,34,57,109};
szie(maoP(arr));
}
public static int[] maoP(int[]a) {
int[]arr=a;
int b=0;
for(int i=0;i<a.length-1;i++) {//最小值冒上来
for(int j=0;j<a.length-1;j++) {//内层
if(a[j]<a[j+1]) {//第一轮交换//与相邻交换
b=a[j];
a[j]=a[j+1];
a[j+1]=b;
}
}
}
return arr;
}
public static void szie(int []a) {
for(int i=0;i<a.length;i++) {
System.out.print(" "+a[i]);
}
}
}
选择排序
思路,把最大或最小的每次都和首个一个元素交换,第一次遍历完,最大或最小的存在于首位,再把剩下的看作一个整体,重复操作
public class xuanze {
public static void main(String[] args) {
int[]arr2=new int[] {10,9,88,12,7,76,34,57,109};
ziez(arr2);
System.out.println();
ziez(xuanZ(arr2));
}
public static int[] xuanZ(int[]a) {
int[] arr=a;
for(int i=0;i<arr.length;i++) {
for(int j=i+1;j<arr.length;j++)//选择排序与首位交换
{
if(arr[i]<arr[j]) {
int tmp=arr[i];
arr[i]=arr[j];
arr[j]=tmp;
}
}
}
return arr;
}
public static void ziez(int[]a) {
for(int i=0;i<a.length;i++) {
System.out.print(" "+a[i]);
}
}
}
不过java自带的排序算法封装在jre中使用的是快排 用法Arrays.sort(数组名);
import java.util.Arrays;
public class homework4 {
public static void main(String[] args) {
int[]arr=new int[] {10,9,88,12,7,76,34,57,109};
tset(arr);
Arrays.sort(arr);//用法Arrays.sort(数组名);
tset(arr);
}
public static void tset(int[]a) {
for(int i=0;i<a.length;i++) {
System.out.print(" "+a[i]);
}
System.out.println();
}
}