2.8.3 数组操作常见问题
1,越界
2,空指针
获取数组中的元素。
数组有length属性,求数组长度。
定义数组:
1、静态初始化:
2、动态初始化:
非法:
因为arr指向的是地址。
合法:
2.8.4数组常见操作
max初始化不能等于0,因为当数组元素都是负数时,最后结果是0最大,但0不是数组元素。
当max为数组元素角标时,可以初始化为0.
数组排序:
最快排序算法:希尔排序
Java自带有排序方法:Array.sort();
1、选择排序:选择一个值跟其他值依次比较。
内循环结束一次之后,最值出现在头角标处。
2、冒泡排序:相邻的两个元素进行比较,如果符合条件就换位。
内循环结束一次之后,最值出现了最后角标位置。
无论什么排序方式,都需要对满足条件的元素进行位置置换。
所以可以把这部分相同代码提取出来,单独封装成一个函数。
数组的查找操作。
折半查找:可以提高查找效率,但是数组必须是有序数组。
折半的第二种方式:
练习:有一个有序数组,如果将一个元素插入到该数组中,
还要保持该数组是有序的,如何获取该元素在数组中的位置。
十进制—>二进制
十进制—>十六进制
查表法:将所有元素临时存储起来。建立对应关系。
每一次&15后的值作为索引去查建立好的表。就可以找到对应的元素。
可以通过数组的形式定义这个表。
2.8.5二维数组
int[] x,y[];//x一维,y二维
相当于:
int[] x;
int[] y[];
1,越界
2,空指针
获取数组中的元素。
数组有length属性,求数组长度。
定义数组:
1、静态初始化:
int arr[] = {1,2,3};
2、动态初始化:
int arr[] = new int[3];
非法:
int arr[] = new int[3];
arr = {1,2,3};
因为arr指向的是地址。
合法:
int arr[] = new int[3];
arr[0]=1;
arr[1]=2;
arr[2]=3;
2.8.4数组常见操作
给定数组求最大值:
public static int getMax(int[] arr){
int max = arr[0];
for(int x=1; x<arr.length; x++){
if(arr[x]>max)
max = arr[x];
}
return max;
}
max初始化不能等于0,因为当数组元素都是负数时,最后结果是0最大,但0不是数组元素。
当max为数组元素角标时,可以初始化为0.
public static int getMax(int[] arr){
int max = arr[0];
for(int x=1; x<arr.length; x++){
if(arr[x]>arr[max])
max = x;
}
return arr[max];
}
数组排序:
最快排序算法:希尔排序
Java自带有排序方法:Array.sort();
1、选择排序:选择一个值跟其他值依次比较。
内循环结束一次之后,最值出现在头角标处。
public static void selectSort(int[] arr){
//int temp = arr[0];
for(int x=0; x<arr.length-1; x++){
for(int y=x+1; y<arr.length; y++){
if(arr[x] > arr[y]){
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
}
}
}
2、冒泡排序:相邻的两个元素进行比较,如果符合条件就换位。
内循环结束一次之后,最值出现了最后角标位置。
public static void bubbleSort(int[] arr){
for(int x=0; x<arr.length-1; x++){
for(int y=0; y<arr.length-x-1; y++){//-x:让每一次比较元素减少,-1:避免数组越界。
if(arr[y]>arr[y+1]){
int temp;
temp = arr[y];
arr[y] = arr[y+1];
arr[y+1] = temp;
}
}
}
}
无论什么排序方式,都需要对满足条件的元素进行位置置换。
所以可以把这部分相同代码提取出来,单独封装成一个函数。
public static void swap(int[] arr,int a,int b){
int temp;
temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
数组的查找操作。
public static int getIndex(int[] arr, int key){
for(int x=0; x<arr.length; x++){
if(arr[x]==key)
return x;
}
return -1;//因为数组下标没有-1,所以一般用-1表示没结果。
}
折半查找:可以提高查找效率,但是数组必须是有序数组。
public static int halfSearch(int[] arr,int key){
int min,mid,max;
min = 0;
max = arr.length-1;
mid = (min+max)/2;
while(arr[mid]!=key){
if(key>arr[mid])
min = mid + 1;
else if(key<arr[mid])
max = mid - 1;
if(min>max)
return -1;//找不到结果的时候。
mid = (max+min)/2;
}
return mid;
}
折半的第二种方式:
public static int halfSearch_2(int arr[],int key){
int min = 0,max = arr.length-1,mid;
while(min<max){
mid = (min+max)/2;
if(key>arr[mid])
min = mid + 1;
else if(key<arr[mid])
max = mid - 1;
else
return mid;
}
return -1;
}
练习:有一个有序数组,如果将一个元素插入到该数组中,
还要保持该数组是有序的,如何获取该元素在数组中的位置。
十进制—>二进制
十进制—>十六进制
查表法:将所有元素临时存储起来。建立对应关系。
每一次&15后的值作为索引去查建立好的表。就可以找到对应的元素。
可以通过数组的形式定义这个表。
2.8.5二维数组
int[] x,y[];//x一维,y二维
相当于:
int[] x;
int[] y[];