数据结构
1.数据与数据之间的逻辑关系:集合、一对一、一对多、多对多
2.数据的存储结构:
线性表:顺序表(例如数组)、链表、栈、队列
树形结构:二叉树
图形结构
package cn.xjtu.java;
public class ArrayExercise {
public static void main(String[] args) {
int[][] arr = new int[][]{{3,5,8},{12,9},{7,0,6,4}};
int sum = 0;
for(int i = 0;i <arr.length;i++) {
for(int j = 0;j < arr[i].length;j++) {
sum += arr[i][j];
}
}
System.out.println(sum);
}
}
package cn.xjtu.java;
public class TriangleTest {
public static void main(String[] args) {
int[][] arr = new int[10][];
for(int i = 0;i < arr.length;i++) {
arr[i] = new int[i+1];
for(int j = 0;j < arr[i].length;j++) {
if(j==0|j==i) {
arr[i][j] = 1;
}else {
arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
}
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
}
package cn.xjtu.java;
public class MathTest {
public static void main(String[] args) {
int[] arr = new int[10];
int sum = 0;
int max = 0;
int avg;
int min = 0;
for(int i = 0;i < arr.length;i++) {
arr[i] = (int)(Math.random()*90+10);
min = arr[0];
sum+=arr[i];//和
max = (max > arr[i])?max:arr[i];//最大值
min = (min<arr[i])?min:arr[i];//最小值
}
avg = sum/10;//均值
System.out.println("最大值:"+max);
System.out.println("最小值:"+min);
System.out.println("和值:"+sum);
System.out.println("均值:"+avg);
}
}
数组的复制
package cn.xjtu.java;
public class Test6 {
public static void main(String[] args) {
int[] arr1,arr2;
arr1 = new int[]{2,3,5,7,11,13,17,19};
for(int i = 0;i < arr1.length;i++) {
System.out.print(arr1[i]+" ");
}
System.out.println();
arr2 = arr1;
for(int i = 0;i < arr2.length;) {
arr2[i] = i;
i=i+2;
}
for(int i = 0;i < arr1.length;i++) {
System.out.print(arr1[i]+" ");
}
}
}
arr1改变了,原因:堆空间只有一个数组,这里只是把arr1地址给了arr2,arr1和arr2指的是同一个数组
所以上面这段代码并不是数组的复制
二维数组的地址不能赋值给一维数组,因为除了保存地址之外,还有变量类型
真正数组的复制
package cn.xjtu.java;
public class Test6 {
public static void main(String[] args) {
int[] arr1,arr2;
arr1 = new int[]{2,3,5,7,11,13,17,19};
for(int i = 0;i < arr1.length;i++) {
System.out.print(arr1[i]+" ");
}
System.out.println();
arr2 = new int[arr1.length];
for(int i = 0;i < arr1.length;i++) {
arr2[i] = arr1[i];
}
for(int i = 0;i < arr2.length;) {
arr2[i] = i;
i=i+2;
}
for(int i = 0;i < arr1.length;i++) {
System.out.print(arr1[i]+" ");
}
System.out.println();
for(int i = 0;i < arr2.length;i++) {
System.out.print(arr2[i]+" ");
}
}
}
数组的反转
package cn.xjtu.java;
public class RevertArray {
public static void main(String[] args) {
String[] arr1,arr2;
arr1 = new String[] {"AA","BB","CC","DD","EE","FF"};
arr2 = new String[arr1.length];
for(int i = 0;i<arr1.length;i++) {
int j = arr1.length-1-i;
arr2[i] = arr1[j];
}
for(int i = 0;i < arr2.length;i++) {
System.out.print(arr2[i]+" ");
}
}
}
上述代码的实现需要额外一个数组,效率也比较低,图片中的只需要加一个Temp即可。
线性查找
String des = "GG";
boolean est = false;
for(int i = 0;i < arr1.length;i++) {
if(des.equals(arr1[i])) {
System.out.println("AA位置在arr1数组的第"+i+"个位置");
est = true;
break;
}
}
if(!est) {
System.out.println("很遗憾,没有");
}
二分法查找
第一种:自己写的,比较麻烦
绿色:全部执行
黄色:部分执行
红色:未执行
第二种:
int[] arr3 = new int[] {-98,-34,2,34,54,66,79,101,120,333};
int des2 = 34;
int head = 0;
int end = arr3.length-1;
boolean isFlag = true;
while(head <= end) {
int middle = (head + end)/2;
if(des2 == arr3[middle]) {
System.out.println("查找数在数组的第"+(middle+1)+"个位置");
isFlag = false;
break;
}else if(des2 > arr3[middle]){
head = middle+1;
}else {
end = middle-1;
}
}
if(isFlag) {
System.out.println("没有目标");
}