数组的使用及算法

目录

7. 数组的扩容

9.数组类型的参数和返回值

10. 值传递和引用传递

11. 排序

11.1 冒泡排序

11.2选择排序

11.3 二分查找

11.4 数组的插入

11.5 数组的删除

12. 可变长参数

13. 二维数组


7. 数组的扩容

注意:数组的长度是固定的  所以长度是无法改变的 

我们这里所谓的扩容其实是  将原数组中的内容  复制到新数组中 

然后再将原数组的地址

指向新数组的空间

public class TestArrayGrow {
    public static void main(String[] args) {
        int [] oldArr = {1,2,3,4,5};

        int [] newArr = new int[oldArr.length * 2];

        for(int i = 0;i < oldArr.length;i++){
            // 这里要执行复制元素的操作
            // 等号右边赋值给等号左边的
            newArr[i] = oldArr[i];
        }
        System.out.println(Arrays.toString(newArr));

        System.out.println(oldArr);
        System.out.println(newArr);

        oldArr = newArr;

        System.out.println(oldArr);
        System.out.println(newArr);
    }
}

8. 数组的复制

复制数组的三种方式:

1.编写循环实现复制

2.void System.arraycopy(原数组,起始位置,新数组,起始位置,复制元素个数)

   注意下标和元素个数不要超出范围

3.数组 [ ]  Arrays.copyOf(原数组,新长度)

public class TestArrayCopy {
    public static void main(String[] args) {
        int [] oldArr = {1,2,3,4,5};
        int [] newArr = new int[oldArr.length];

        System.arraycopy(oldArr, 0,newArr,0,5);
        System.out.println(Arrays.toString(newArr));

        System.out.println("--------------------------------------------------");

        // [1, 2, 3, 4, 5]
        int [] copyArr =  Arrays.copyOf(newArr, 10);
        System.out.println(Arrays.toString(copyArr));
    }
}

9.数组类型的参数和返回值

不管是作为参数,还是作为返回值,跟之前的使用方式相同

/**
 *  需求:
 *  1.编写方法实现统计5门课程成绩 并且返回
 *  2.编写方法用于接收一个成绩数组 然后将成绩进行打印
 *
 */
public class TestArrayParameterReturned {

    public static double[] inputScore(){
        Scanner input = new Scanner(System.in);
        double [] scores = new double[5];
        for(int i  =0;i < scores.length;i++){
            System.out.println("请输入第" + (i + 1) + "门成绩");
            scores[i] = input.nextDouble();
        }
        return scores;
    }
    public static void printScore(double [] scores){
        for(int i = 0;i < scores.length;i++){
            System.out.println("第" + (i + 1) + "门成绩为:" + scores[i]);
        }
    }
    public static void main(String[] args) {
        double [] scores =  inputScore();
        printScore(scores);
        System.out.println(Arrays.toString(scores));、
    }
}

10. 值传递和引用传递

Java官方明确表示 Java中只有值传递 没有引用传递 “引用传递”也属于值传递  只不过这个值是一个地址 也是一个引用

基本数据类型传参  属于值传递  在方法中对值的改变 不会影响原变量

引用数据类型传参  属于引用传递  在方法中根据地址操作数据 会影响原变量

String类型是特殊的引用数据类型  作为参数传递不会改变原变量

public class TestTransfer {
    public static void transferValue(int num){
        num++;
        System.out.println("transferValue方法中num的取值为:" +  num);
    }
    public static void transferAddress(int [] nums){
        System.out.println("transferAddress方法中数组的地址值为:" + nums);
        for(int i = 0;i < nums.length;i++){
            nums[i]++;
        }
    }
    public static void main(String[] args) {
        int a = 10;
        transferValue(a);
        System.out.println(a);

        int [] arr = {1,2,3,4,5};
        System.out.println(arr);
        transferAddress(arr);
        System.out.println(Arrays.toString(arr));
    }
}

11. 排序

冒泡排序:冒泡排序是两个元素比较完成以后  符合条件  立即交换位置  这样对于元素的移动比较频繁

选择排序:使用一个元素 依次与其他元素比较大小 遇到需要交换位置的元素  先不交换  等待第一轮比较完成后再交换位置

11.1 冒泡排序

public class TestBubbleSort {
    public static void main(String[] args) {
        int [] nums = {89,56,441,552,6369,741,85};

        int a = 10;
        int b = 20;

//        int temp = a;
//        a = b;
//        b = temp;

        for(int i = 0;i < nums.length-1;i++){ // 控制比较的轮数
            for(int j = 0;j < nums.length -1 -i;j++){

                if(nums[j] < nums[j + 1]){
                    int temp = nums[j];
                    nums[j] = nums[j + 1];
                    nums[j + 1] = temp;
                }
            }
            System.out.println("第"+(i + 1)+"轮比较完成以后数组的顺序为:" + Arrays.toString(nums));
        }
        System.out.println(Arrays.toString(nums));
    }
}

11.2选择排序

/**
 *  选择排序
 *  外层循环属于比较的数A  从第一个元素开始 直到 倒数第二个元素 int i = 0;i < nums.length - 1;i++
 *  内层循环属于比较的数B  永远是从比较的数A相邻的后边的元素开始 int j = i + 1;j < nums.length;j++
 */
public class TestChoiceSort {
    public static void main(String[] args) {
        int [] nums = {8888,89,100,56,441,552,6369,741,85};

        for(int i = 0;i < nums.length - 1;i++){
            int index = i; // index变量默认值和i相同  用来记录最初i的取值 以及在比较过程中交换下标使用
            for(int j = i + 1;j < nums.length;j++){
                if(nums[index] < nums[j]){
                    index = j;
                }
            }
            if(index != i){ // 当这个条件 表示需要交换位置 反之不需要交换
                int temp = nums[index];
                nums[index] = nums[i];
                nums[i] = temp;
            }
        }
        System.out.println(Arrays.toString(nums));
    }
}

11.3 二分查找

二分查找算法:根据指定的元素  查找此元素在序列中的下标 如果未找到  则返回-1 找到则返回对应的下标

前提:必须是有序数组

将序列一分为二,如果查找的元素小于中间值 则从左边开始查找 如果是大于中间值 则从右边查找

如果等于中间值 则直接返回即可 重复以上过程 直到找到 或者循环条件不成立

public class TestBinarySearch {

    public static void main(String[] args) {
        int [] nums = {8888,89,100,56,441,552,6369,741,85};

        Arrays.sort(nums);
        System.out.println(Arrays.toString(nums));
        System.out.println(binarySearch(nums, 666));
        System.out.println(Arrays.binarySearch(nums, 666));
    }
    public static int binarySearch(int [] nums,int num){
        int index = -1; // 最终用于返回的下标 默认初识值为-1
        int begin = 0; // 开始位置
        int end = nums.length -1; // 结束位置
        int middle = ( begin + end ) / 2; // 中间位置

        while (begin <= end) { //
            if(num < nums[middle]){
                // 从左边查找
                // 因为是小于中间值 所以查找范围为中间下标左侧的序列
                // 所以此时我们需要改变结束下标的位置
                end = middle -1;
            }else if(num > nums[middle]){
                // 从右边查找
                begin = middle + 1;
            }else{
                index = middle;
                break;
            }
            middle = (begin + end) / 2;
        }
        return index;
    }
}

11.4 数组的插入

1.先创建一个比原来长度长1的数组

2.循环实现元素的移动

      如果  下标小于插入的位置 则直接复制到新数组中

      大于等于插入的位置 则将原数组的元素移动到新数组下标+1的位置

3.将新数组空缺的位置  直接插入元素即可

4.将新数组返回

public class TestArraysInsert {

    public static void main(String[] args) {
        int [] nums = {11,22,33,44,55};
        int[] newArr = insert(nums, 888, 2); // .var 自动生成对应类型的变量接收返回值
        System.out.println(Arrays.toString(newArr));
    }
    /**
     * @param nums 被插入元素的数组
     * @param num 插入元素
     * @param index 插入位置
     * @return
     */
    public static int[] insert(int [] nums,int num,int index){
        if(index < 0 || index > nums.length -1){
            return nums;
        }
        int [] newArr = new int[nums.length + 1];
        for(int i = 0;i < nums.length;i++){
            if(i < index){
                newArr[i] = nums[i];
            }else{
                newArr[i + 1] = nums[i];
            }
        }
        newArr[index] = num;
        return newArr;
    }
}

11.5 数组的删除

1.先创建一个比原数组长度-1的数组

2.循环实现数组的移动

      如果  下标小于插入的位置 则直接复制到新数组中

      如果大于等于插入的位置  则将原数组中的元素  从删除下标+1位置开始

      移动到新数组相应的位置

3.将新数组返回

public class TestArraysRemove {
    public static void main(String[] args) {
        int [] nums = {11,22,33,44,55};
        int[] newArr = remove(nums, 3);
        System.out.println(Arrays.toString(newArr));
    }
    public static int[] remove(int [] nums,int index){
        if(index < 0 || index > nums.length -1){
            return nums;
        }
        int [] newArr = new int[nums.length -1];
        for(int i = 0;i < newArr.length;i++){
            if(i < index){
                newArr[i] = nums[i];
            }else{
                newArr[i] = nums[i + 1];
            }
        }
        return newArr;
    }
}

12. 可变长参数

可变长参数:可接收0个或多个同类型实参,个数不限,使用方式与数组相同。

语法:数据类型...形参名

要求:必须定义在形参列表的最后,且整个形参列表中只能有一个可变长参数。

public class TestModifyParameter {
    public static void m1(int...args){
        for(int i = 0;i < args.length;i++){
            System.out.println(args[i]);
        }
        System.out.println("m1方法执行完毕");
    }
    public static void main(String... args) {
        m1(1,2,3,4,5);
    }
}

13. 二维数组

二维数组:数组中的元素还是(一维数组)数组

定义:与一维数组基本一样 四种方式。特别之处,二维数组在定义的时候,高维度的长度必须指定,低维度可以根据需要 是否立即指定

数组的默认值:引用类型为null

二维数组的遍历,使用嵌套循环

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值