「这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战」。
内存解析
练习一(观察能否过编译)
声明:int[]x,y[;在给x,y变量赋值以后,以下选项允许通过编译的是:(注意:x是一维数组,y是二维数组)
a ) x[0]= y; no
b) y[0]= x; yes
c) y[0] [0]= x; no
d)x[0] [0] =y; no
e) y[0] [0] = x[0]; yes
f) x = y; no(判断赋值能否过编译:1.同类型 2.能自动类型提升)
例题二(杨辉三角赋值)
/**
* 打印杨辉三角(10行)
* 【提示】
* 1.第一行有1个元素,第n行有n个元素
* 2.每一行的第一个元素和最后一个元素都是1
* 3.从第三行开始,对于非第一个元素和最后一个元素的元素。
* 即:
* yanghui[i][j]= yanghui[i-1][j-1]+ yanghui[i-1][j];
*/
public class TwoArrayText {
public static void main(String[] args) {
int[][] array=new int[10][];
//赋值
array[0]=new int[]{1,1};
for(int i=1;i< array.length;i++){
array[i]=new int[i+2];
for(int j=0;j<array[i].length;j++){
if(j==0||j==array[i].length-1)
array[i][j]=1;
else
array[i][j]=array[i-1][j-1]+array[i-1][j];
}
}
//打印
for(int i=0;i< array.length;i++){
for(int k=1;k<=array.length-i;k++){
System.out.print('\t');
}
for(int j=0;j<array[i].length;j++){
System.out.print(array[i][j]+"\t");
}
System.out.println();
}
}
}
例题三(随机数赋值,且不能重复)
/**
* 创建一个长度为6的int型数组,要求数组元素的值都在1-30之间,且是随机赋值。同时,要求元素的值各不相同。
*/
public class TwoArrayText1 {
public static void main(String[] args) {
//我的解法
int[] array=new int[6];
for(int i=0;i<array.length;i++){
array[i] = (int) (Math.random() * 30) + 1;//注意随机数本身是double型,要么强制转换,要么用double型
for(int j=0;j<i;j++) {
while(true){
if(array[i]==array[j])
array[i] = (int) (Math.random() * 30 + 1);//注意括号的问题,没括号,
//Math.random()先运算,结果一直是0
else
break;
}
}
}
for(int k=0;k<array.length;k++){
System.out.println(array[k]);
}
//老师的解法
// int[] arr = new int[6];
// for (int i = 0; i < arr.length; i++) {// [0,1) [0,30) [1,31)
// arr[i] = (int) (Math.random() * 30) + 1;
//
// for (int j = 0; j < i; j++) {
// if (arr[i] == arr[j]) {
// i--;
// break;
// }
// }
// }
//
// for (int i = 0; i < arr.length; i++) {
// System.out.println(arr[i]);
// }
}
}
数组的复制、反转、查找(线性查找、二分法查找)
public class ArrayChange {
public static void main(String[] args) {
String[] arr = new String[]{"dd", "bb", "ss", "ff", "ee"};
//数组的复制
//数组的复制(区别于数组变量的赋值:arr1 =arr)
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];//temp是一个中间值
arr[i] = arr[arr.length - i - 1];//注意别忘了减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;
}
//遍历
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + "\t");
}
//查找(搜索)
//线性查找
String dest = "kk";
boolean yes = false;//没有yes找到了之后也会再输出一个没找到
for (int i = 0; i < arr.length; i++) {
if (dest.equals(arr[i])) {//字符串比较,不能用==,用.equals()
System.out.println("找到了,位置为" + i);
yes = true;
break;
}
}
if (yes == false)
System.out.println("没找到");
//二分法查找(前提是有序)(快速)
int[] arr2 = new int[]{-98, -34, 2, 34, 54, 66, 79, 105, 210, 333};
int dest1 = -34;
boolean isFlag=true;
int head = 0;//初始的首索引
int end = arr2.length - 1;//初始的末索引
while (head <= end) {//注意终止条件
int middle = (head + end) / 2;
if (dest1 == arr2[middle]) {
System.out.println("找到了指定的元素,位置为:" + middle);
isFlag=false;
break;
} else if (arr2[middle] > dest1) {
end = middle - 1;//因为等于的情况已经排除,所以middle可以排除,这里可以-1,+1
} else { // arr2[ middle] < dest1
head = middle + 1;
}
}
if(isFlag)
System.out.println("没找到");
}
}
数组元素的排序算法
通常来说,排序的目的是快速查找。
衡量排序算法的优劣:
1.时间复杂度:分析关键字的比较次数和记录的移动次数
2.空间复杂度:分析排序算法中需要多少辅助内存
3.稳定性:若两个记录A和B的关键字值相等,但排序后A、B的先后次序保持不变,则称这种排序算法是稳定的。
分类:
内部排序:所有排序操作都在内存中完成。
外部排序:数据量非常大,计算机无法把整个排序过程放在内存中完成,必须借助于外部存储器(如磁盘)。
外部排序最常见的是多路归并排序。可以认为外部排序是由多次内部排序组成。