数组最基础

一维数组

静态初始化数组

数据类型[] 数组名;

动态初始化数组

数据类型[] 数组名 = new 数据类型[数组长都度]

定义数组时,元素类型不同,默认值不同

数组元素类型默认初始值
byte、short、int,long0
float,double0.0
char'\u0000'(空字符)
booleanfalse
引用数据类型null

数组执行原理

方法区:字节码文件先加载到这里

栈:方法运行时所进入的内存区域,由于变量在方法中,所以变量也在这一块 区域中

堆:存储new出来的东西,并分配地址。由于数组是new 出来的,所以数组也在 这块区域。

数组使用过程可能出现的问题

数组下标越界

如果在数组中保存的元素可以自动提升(自动类型转化)为数组自己的类型,那是可以保存的

数组反转:

某个数组有5个数据:10,20,30,40,50,请将这个数组中的数据进行反转。 [10, 20, 30, 40, 50] 反转后 [50, 40, 30, 20, 10]

解法:

1.每次交换,需要有左右两边的两个索引,我们可以用i和j表示 刚开始i=0,j=数组长度-1;

2.每次让i和j索引位置的两个元素互换位置 arr[i]和arr[j]互换位置

3.每次还完位置之后,让i往右移动一位,让j往前移动一位

排序

排序算法 有多种,常用的排序算法有冒泡排序、插入排序、选择排序、快速排序、 堆排序、归并排序、希尔排序、二叉树排序、计数排序等。

选择排序:

表现最稳定的排序算法之一,因为无论什么数据进去都是O(n2)的时间复杂度,所 以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了 吧。

选择排序(Selection-sort)是一种简单直观的排序算法。

它的工作原理:首先在未排序序 列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素 中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素 均排序完毕。 n个记录的直接选择排序可经过n-1趟直接选择排序得到有序结果。

具体算法描述如 下: 初始状态:无序区为R[1..n],有序区为空;

第 i 趟 排 序 (i=1,2,3…n-1) 开 始 时 , 当 前 有 序 区 和 无 序 区 分 别 为 R[1..i-1] 和 R(i..n)。该趟排序从当前无序区中-选出关键字最小的记录 R[k],将它与无序区 的第1个记录R交换,使R[1..i]和R[i+1..n)分别变为记录个数增加1个的新有序区 和记录个数减少1个的新无序区;

n-1趟结束,数组有序化了

public static void main(String[] args) {
        //选择排序
        int[] arr = {55,34,2,77,45,4,8,40};
        for (int i = 0; i < arr.length - 1; i++) {
            int current = arr[i];
            int index = i;
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[index] > arr[j]){
                    index = j;
                }
            }
            arr[i] = arr[index];
            arr[index] = current;
        }
        for (int i1 = 0; i1 < arr.length; i1++) {
            System.out.println(arr[i1]);
        }
    }
插入排序

从第i + 1个数据向前找,认为前面的数据是已经排列好的,若索引大于等于零并且若前面的数大于当前数,把前面数据赋值给当前数据,若不满足索引大于等于零并且若前面的数大于当前数,跳出循环,把当前数据插入

public static void main(String[] args) {
        //插入排序
        int[] arr = {55,34,2,77,45,4,8,40};
        for (int i = 0; i < arr.length -1; i++) {
            int current = arr[i + 1];
            int index = i;
            for(;index >= 0 && current < arr[index];index--){
                   arr[index + 1] = arr[index];
                }
            arr[index + 1 ] = current;
            }
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "\t");
        }
        }
冒泡排序

每次循环,比较相邻的两个数据,进行交换位置,会找到一个最大或最小的数字,把他放到数组一边

每循环一次,都可以少遍历一个数据

public static void main(String[] args) {
        //冒泡排序
        int[] arr = {2,3,1,8,3,9,6};
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length - 1 - i; j++) {
                if (arr[j + 1] > arr[j]){
                    arr[j] = arr[j + 1] ^ arr[j];
                    arr[j + 1] = arr[j + 1] ^ arr[j];
                    arr[j] = arr[j + 1] ^ arr[j];
                }
            }
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "\t");
        }
    }
二分查找:

二分查找(Binary Search)算法,也叫折半查找算法。二分查找的思想非常简单,有 点类似分治的思想。二分查找针对的是一个有序的数据集合,每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,直到找到要查找的元素,或者区间 被缩小为 0。

public static void main(String[] args) {
        int[] arr = {1,2,5,7,9,10};
        int start = arr[0];
        int end = arr.length - 1;
        int mid = (start + end) / 2;
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个数字");
        int key = sc.nextInt();
        while( end >= start){
           if (key == arr[mid]){
               System.out.println(mid);
               break;
           }else if (key < arr[mid]){
               end = mid - 1;
           }else {
               start = mid + 1;
           }
             mid = (start + end) / 2;
        }
        if (end < start){
            System.out.println(-1);
        }
​
    }
多维数组:

二维数组:

数据类型 [] [] 数组名;

初始化

int[] [] arr = new int[3] [4];

int[] [] arr = {

{1,2,3},

{4,5}

}

二维数组的迭代

for(int i = 0;i < arr.length;i++){
​
•   for(int j; j< arr[i].length;j++){
​
•   System.out.println(a)
​
}}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值