Java一维数组与二维数组的遍历、查找及排序

    一维数组

保存一组数据类型相同的数据

声明一个数组: 数据类型[ ]   数组名  =  初值

注意: 这里的数据类型指的是数组中保存数据的类型

声明方式一:  

int[] array = new int[数组的长度];

注意: 数组的长度一旦确定 就不能更改

new 表示 堆内存中开辟的空间
数组在堆内存中 开辟的是一块连续的内存空间
main函数存储在栈内存中
栈内存中保存的是堆内存数组的首地址
如: int[] array = 0x00123

声明方式二:

给出数组长度和元素
int[] array = new int[]{1,3,5,10};

声明方式三:

语法糖 便捷写法
int[] array = {1,3,5,10};

栈内存特点:

1. 函数执行完毕 系统自动释放空间

2.先进后出原则

堆内存特点: 

1. 分配内存地址

2.有初始值 基本数据类型初始值为0

3.有垃圾回收机制

当该内存无人使用时 成为垃圾 某一时刻被系统释放

    数组的存取

使用下标存取,下标从0开始

存:
  array[下标] = 值;
取值:
  System.out.println(array[下标]);
取值时注意数组下标 防止打印报错---数组越界异常
若  array = null; 空指针异常
访问一块不属于你指向的内存空间

    数组的遍历

打印数组中所有的元素

获取数组的长度 :   数组名.length;

凡是数组的问题,一般都会用得到遍历

for(int i = 0; i < array.length; i++){
    Sysm.out.print(array[i] + " ");
}

常见有 通过具体数值查找该值在数组中的位置、查找数组中某一位置的元素

数组元素的反转(元素位置调换)

通过定义声明一个临时变量

int a = 10;
int b = 15;
int temp = a;
a = b;
b = temp;
封装函数交换数值时,基本数据类型接收参数是一个值的传递

引用数据类型(数组 接口 类)是地址之间的传递,可直接打印,不需要返回值


    冒泡排序

核心思想: 相邻两个数作比较来换位

int[] array = (1,8,7,12);
/*
 * 外循环控制一共比较多少趟
 * 内循环控制一趟比较多少次
 */
for(int i = 0; i < array.length - 1; i++){

    // 内循环 -1 防止数组越界
    // 内循环 -i 确定一个数 每次都烧比较依次
    for(int j = 0; j < length - 1 - i; j++){
   // 判断相邻元素的大小
   if(array[j] > array[j + 1]){
    int temp = array[j];
    array[j] = array[j + 1];
    array[j + 1] = temp;
   }
  }
}
    选择排序

核心思想: 选择第一个数和其后元素依次比较 交换

int[] array = {3,2,5,1,6};
		// 5个数比4趟循环
		for (int i = 0; i < array.length - 1; i++) {
			for (int j = i + 1; j < array.length; j++) {
				// 用第i个数 和剩下的每一个数比较
				// 量化思维
				// i = 0  j: 1,2,3
				// i = 1  j: 2,3
				// i = 2  j: 3
				int temp = 0;
				if (array[i] > array[j]) {
					// 交换
					temp = array[i];
					array[i] = array[j];
					array[j] = temp;
				}
			}
		}
    折半查找

前提: 必须是有序的数组

查找元素在数组中的位置

中间坐标 = (最大角标 + 最小角标) / 2;

int[] array = {1,22,33,44,55,66};
		int key = 22;
		//  先定义能使用到的变量
		//  最大 最小 中间
		int min = 0;
		int max = array.length - 1;
		int mid = (min + max)/2;
		//  循环 --- 明确知道循环的停止条件
		while(array[mid] != key) {
			// 判断 key和中间角标的值
			// 来挪动 最小角标或最大角标
			if (array[mid] < key) {
				min = mid + 1;	
			}else if(array[mid] > key){
				max = mid - 1;
			}
			// 每次循环都要有折半操作
			mid = (min + max) / 2;
			// 数组中没有这个数的时候
			if (min > max) {
				// 没有这个数 使用-1表示
				mid = -1;
				break; // 跳出循环
			}
		}
		System.out.println("该值的下标是:" + mid);
    二维数组

保存多个相同类型的一维数组

数据类型[][]  数组名  =  初值;

声明一个二维数组:

int[ ][ ]  array = new int[2][3];

这个二维数组中有两个一维数组,每个一维数组中有三个元素

声明方式二:

int[ ][ ] array = new int[][]{

   {1,11,111},

   {2,22,222} 

  };

遍历二维数组:

for (int i = 0; i < array1.length; i++) {
			for (int j = 0; j < array1[i].length; j++) {
				System.out.print(array1[i][j] + " ");
			}
			System.out.println();
		}

.......

三维数组就是保存多个相同类型的二维数组


猜你喜欢

转载自blog.csdn.net/lijock/article/details/80230850