数组
定义一维数组和二维数组以及多维数组
一维:int [ ] array = new int [ ]; int [ ] array = { }; int [ ] array = new int [ ] { };这种书写不可填入数组元素数目
二维:int [ ] [ ] array = new int [ ] [ ] ; int [ ] [ ] array = { { },{ },{ } }; int [ ] [ ] array = new int [ ] [ ]{ { }, { },{ }};也不能写数组元素数目
根据索引找数组中的元素
需求:能够根据用户输入的1,返回一,输入的2,返回二
思路:已有的条件(索引,数组),直接利用数组元素输出语句求出数组中对应元素
代码实现:
public static char fanhui(int a) {
char []print= {'一','二','三','四','五','六','七'};
return print[a-1];
}
根据提供的数组中元素找出索引
需求:有数组 int [ ] array={1,2,3,4},求出3在数组中的角标位置
分析:可以将这个功能封装成一个函数,输入数组和要查找的元素作为参数即可查找
代码实现:
public static int weizhi(int n,int []a) {
//定义一个变量,index保存下标
//如果索引的初值为零,当数组的长度为零的时候,会直接返回零,会与数组真正的下标零混淆
int index = -1;
for(int x=0;x<a.length;x++) {
if(a[x] == n) {
index = x;
return index;
//return x :这里已经把值返回了,结束整个函数,后面不管写什么都没有意义,跟break、continue差不多
}
}
return index;
}
小结:代码中 int index = -1;return index;可以防止出现空数组的情况
数组自身元素的反转
需求:int [ ] array={1,4,2,5,3,,6};实现这个数组的反转
分析:可以取数组长度的中间值,然后以这个中间值为条件,在For循环中将数组进行反转
public static void change(int[] array) {
int number = array.length / 2;
for (int x = 0; x < number; x++) {
int c;
c = array[x];
array[x] = array[array.length - 1 - x];
array[array.length - x - 1] = c;
//此时在调用函数的时候,相当于值的传递,这样交换不了两个数的值(不同空间中没关系)
//kk(array[x], array[array.length - 1 - x]);
}
System.out.println(Arrays.toString(array));
}
小结:在这里交换两个数值的时候,不可以调用一个封装这个功能的函数,因为两个函数是栈中不同的空间,另一个函数中数值的交换对于另一个函数没有影响
数组的冒泡排序
定义:数组中相邻的两个元素之间进行比较
核心:相邻的元素进行比较
分析:冒泡排序的结果是升序,每趟得出最后位的最大值,可以使用外循环控制比较的趟数,内循环控制每趟比较的次数
代码实现:
public static void sort(int []a) {
for(int x = 0; x < a.length-1; x++) {
for( int y = 0; y<a.length-1-x; y++) {
if( a[y] > a[y+1] ) {
int c = a[y];
a[ y ] = a[y+1];
a[ y + 1] = c;
}
}
}
}
分析:外循环中:数组的第一个数不用跟自己比较,所以比较次数为x=a.length-1
内循环中:-1:当不加-1的时候,a[ y ]可以取到a.length-1,那么a[y+1]=a.length,就会溢出报错
-x:每趟循环的次数在减少,减少的值正好是每次外循环的x的大小
数组的选择排序
定义:数组的每个元素跟之后的每个元素进行比较
分析:选择排序是升序,每次循环可得到首个位置的最小值,使用外循环控制循环躺数,内循环控制每趟比较次数
代码实现:
public static void main(String[] args) {
int []num= {1,3,4,32,2,43,5};
//x<num.length-1 外循环最后一个数不用再比较了
for(int x = 0; x<num.length-1; x++) {
//y=x+1 每次都可以少比一个数
for(int y=x+1;y<num.length;y++) {
if(num[x]<num[y]) {
int c=num[x];
num[x]=num[y];
num[y]=c;
}
}
}
System.out.println(Arrays.toString(num));
}
小结:外循环中:-1:最后一个数不用跟自己比较,所以比较次数是 x=num.length-1
内循环中:x+1:每次内循环都是从比较元素后面的一个元素依次向后比较
数组的折半查找
定义:给定一个数,在数组查找,通过不断跟数组中间角标所属数值进行比较,缩小范围,更快得出结果。
实现代码:
int min = 0;
int max = array.length-1 ;
int mid = (max + min) / 2;
//声明要查找的值
int key = 11;
//循环查找,循环体里要有折半的操作
//为什么使用while循环?因为我现在已经明确知道循环什么时候停止
//key和中间角标的值比较,如果相等循环停止
while(key != array[mid]) {
if(key > array[mid]) {
min = mid + 1;
}else if(key < array[mid]) {
max = mid-1;
}
//重复折半的操作
//最终正好是max=min,这时候得到那个角标
mid = ( max+min )/2;
//如果数组中没有这个数,会造成死循环,需要一个出口让程序停止
if(min>max) {
//说明这里没找到这个数
mid = -1;//相当于给了一个标志
break;
}
}
System.out.println("坐标"+mid);
二维数组
命名规范: int [ ] [ ] array = new int [x ] [y ]; int [ ] [ ] array={ { },{ },{ }};
以上命名方式一种:x:代表二维数组种一维数组个数 y:代表每个一维数组中元素个数
需求:遍历二维数组
代码实现:
System.out.println(array1.length);//二位数组的长度是一维数组的个数
for(int x=0; x<array1.length; x++) {
for(int y= 0 ; y < array1[x].length; y++){
System.out.print(array1[x][y] + " ");
}
System.out.println();
}