数组+排序+查找

数组

数组是一种类型

创建

创建方法分为 动态初始化静态初始化

1.先定义数组后引用数组( 直接分配 空间)

//下面是两种写法
int[] arr = {12,13,11};
int arr[] = {12,13,11}
// 数据类型 数组名[] = {元素1,元素2,元素3...}
//意思是创建一个int类型的数组,元素是12,13,11.

// 调用,和Python的调用如出一辙
arr[0]
// 数组的调用和Python一样,同样是下标索引从0开始,到它(长度-1)的地方结束。

2.先声明数组后创建数组(先声明一个名字,后面具体使用再分配空间)

// 同样是两种方法
int[] arr = new int[49];
int arr[] = new int[49];
// 数据类型[] 数据名 = new 数据类型[大小/长度]

// 调用的方法一样
arr[0]

3.补充一种初始化方法

String str[] = new String[]{"a","b","c"};
// 这个在编译器上是行得通的

注意事项及细节

  1. 数组是多个 相同类型 的数据的组合,实现堆这些数据的统一管理(自动类型转换可以用)

  2. 数组中的元素可以是 基本数据类型引用数据类型 ,但 不能混用

  3. 数组创建后没有赋值时,默认值有:
    int 0;short 0,byte 0,long 0,float 0.0,double 0.0,char \u0000,boolean false,String null

  4. 使用数组的步骤: 声明数组 并且开辟空间,给数组各个元素 赋值 ,使用数组

  5. 数组 下标0 开始,数组的 大小/长度-1 结束。末位的数组元素下标 不等于 数组长度。

  6. 数组必须在指定范围内使用,否则会爆出 下标越界异常 (编译为class文件时是不会爆出这个异常的)

  7. 数组属于 引用型 ,数组数据类型是对象(object)

数组赋值机制

数组默认使用 引用传递 ,从内存角度来讲,数组的元素放在堆当中,在栈中仅仅只是存储了它的 地址
例如 int arr1[] = {1,2,3} ; int[] arr2 = arr1 表示的是arr2和arr1拷贝了相同的地址,共享了数组,两者改变元素时会同时改变数组的元素。
也即是说,两者不能使用变量赋值的那种值传递/值拷贝,只能拷贝 相同的地址 操作 相同的数组 ,这在Python当中也称为浅拷贝。
补充:JVM的内存:堆+栈+方法区

排序

排序时将多个数据按照 指定顺序排列 的过程。

分类(后面有详细解析)

  1. 内部排序 :指将需要处理的所有数据都加载到内部存储器中进行排序。包括(交换式排序法、选择式排序法和插入式排序法);
  2. 外部排序 :数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。包括(合并排序法和直接合并排序法)。

冒泡排序简述

两两互相比较,谁大谁向右边移动。(反过来也可以,这是观察出来的。)

观察结果:
数组大小为5时,
数组第1次交换5-1次 4
数组第2次交换5-2次 3
数组第3次交换5-3次 2
数组第4次交换5-4次 1
整体交换了4次,每次的子交换逐级递减。
每一轮排序确定一个最大数,确定完成后的最大数不参与排序。
每一轮因为减少一个最大数,排序的方式也就逐级递减。

查找()

  1. 顺序查找
    按个查找
  2. 二分查找
    数组必须有序,先看中间数,
    预加入数值>中间数 向中间数右边查找
    预加入数值<中间数 向中间数左边查找
    (算法处讲解)

多维数组-二维数组

  1. 概述 :二维数组的每一个元素都是一维数组,所以不能出现除了数组和null外的其他类型.
  2. 使用方式 :
    下面是所有的初始化方法
// 1.动态初始化(直接创建)
// 类型[][] 数组名 = new 类型[大小][大小];
int[][] num = new int[12][15];
// 2.动态初始化(先声明再定义数组名/开辟空间)
// 1.声明:类型 数组名[][];
// 2.定义:数组名 = new 类型[大小][大小];
// 3.赋值
// 3.动态初始化(列数不确定,也称为列数不等二维数组)
// 1.创建一个二位数组,其中有3个一维数组,且都为null,也就是没有开空间:
int[][] arr = new int[3][]
// 此时,就相当于:
[null,null,null]
// 2.创建一个不定大小的1维数组(固定行,列的大小是不固定的)
for(int i=0;i<arr.length;i++) {
// 这里的i+1是在开辟第二维度的空间大小,说白了,就是第二层的一维数组大小
arr[i] = new int[i+1];
}
// 3.将数组挨个赋值,否则数组的元素全是0

// 4.静态初始化
// 1.定义 类型 数组名 = {{值1,值2...},{值1,值2...},{值1,值2...}}
// 2.直接访问即可

二维数组在内存的存在形式

假设有这么一个数组:

int[][] arr = {{1,2,3},{4,5,6}}; 

内存区域当中,分为三个区域:栈/堆/方法
数组先在栈当中新建一个记录,指向堆当中的一个一维数组,但一维数组内的两个值是一个堆地址,指向的是二维的堆地址。

注意事项

  1. 声明方式:
int[] y[][]/int[] y[]/int y[][](三种方式)
  1. 数组组成:多个一位数组组成,各维度长度可相同可不同
  2. 列数不等二维数组:顾名思义,列数不相等