数据结构 数组中常见的算法(笔记十)

一、数据结构

1.数据与数据之间的逻辑关系:维合、一对一、一对多、多对多
2.数据的存储结构:
线性表:顺序表(比如:数组)、链表、栈、队列
树形结构:二叉树
图形结构:

二、数组中涉及的常见算法

1.数组元素的赋值(杨辉三角、回形数等)
2.求数值型数组中元素的最大值、最小值、平均数、总和等
3.数组的复制、反转、查找(线性查找、二分法查找)
4.数组元素的排序算法

(1)杨辉三角

在这里插入图片描述

(2) 求数值型数组中元素的最大值、最小值、平均数、总和等
**
 * @Description:算法的考查:求数值型数组中元素的最大值、最小值、平均数、总和等
 * 定义一个int型的一维数组,包含1日个元素,分别赋一些随机整数,
 * 然后求出所有元素的最大值,最小值,和值,平均值,并输出出来。
 * 要求:所有随机数都是两位数。 $
 * @Author: dyq
 * @Date: $
 */
public class Test05 {
    public static void main(String[] args) {
        int[] arr = new int[10];

        for (int i =0;i<arr.length;i++){
            arr[i]= (int)(Math.random()*(99-10+1)+10);
        }
        //遍历
        for (int i =0;i<arr.length;i++){
            System.out.println(arr[i]);
        }
        //求数组元素的最大值
        int max =arr[0];
        for (int i=0;i< arr.length;i++){
            if(max<arr[i]){
                max=arr[i];
            }
        }
        System.out.println("最大值为:"+max);

        //求最小值
        int min =arr[0];
        for (int i=0;i< arr.length;i++){
            if(min>arr[i]){
                min=arr[i];
            }
        }
        System.out.println("最小值为:"+min);

        //求和
        int sum =0;
        for (int i =0;i<arr.length;i++){
            sum+=arr[i];
        }
        System.out.println("总和为:"+sum);

        //数组元素的平均数
        double avg = sum/arr.length;
        System.out.println("平均值为:"+avg);

    }
}

(3).数组的复制、反转、查找(线性查找、二分法查找)

a、数组的复制

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
数组的赋值:

public class Test06 {
    public static void main(String[] args) {
      int[] arry1,arry2;

      arry1 = new int[]{2,3,5,7,11,13,17,19};

      //显示arry1的内容
        System.out.print("第一次输出arry1:");
        for (int i=0;i<arry1.length;i++){
            System.out.print(arry1[i]+"\t");
        }
        //赋值arry2变量arry1  不能称作数组的复制
        arry2=arry1; //array1和array2地址值相同,都指向了堆空间的唯一的一个数组实体。

        //修改arry2中的偶数索引元素,使其等于索引值(如array[0]=0,array[2]=2)。打印出array1。
        for (int i=0;i<arry2.length;i++){
            if(i % 2==0){
                arry2[i]=i;
            }
        }
            System.out.print("第二次输出arry1:");
        for (int i=0;i<arry1.length;i++){
            System.out.print(arry1[i]+"\t");
        }

    }
}

输出结果:

第一次输出arry1:2	3	5	7	11	13	17	19	
第二次输出arry1:0	3	2	7	4	13	6	19	

数组的复制:

public class Test07 {
    public static void main(String[] args) {
      int[] arry1,arry2;

      arry1 = new int[]{2,3,5,7,11,13,17,19};

      //显示arry1的内容
        System.out.print("第一次输出arry1:");
        for (int i=0;i<arry1.length;i++){
            System.out.print(arry1[i]+"\t");
        }

       //数组的复制
       arry2 = new int[arry1.length];
        for (int i =0;i<arry2.length;i++){
            arry2[i]=arry1[i];
        }

        //修改arry2中的偶数索引元素,使其等于索引值(如array[0]=0,array[2]=2)。打印出array1。
        for (int i=0;i<arry2.length;i++){
            if(i % 2==0){
                arry2[i]=i;
            }
        }
            System.out.print("第二次输出arry1:");
        for (int i=0;i<arry1.length;i++){
            System.out.print(arry1[i]+"\t");
        }
    }
}
第一次输出arry1:2	3	5	7	11	13	17	19	
第二次输出arry1:2	3	5	7	11	13	17	19	
数组的反转,查找
public class Test08 {
    public static void main(String[] args) {
        String[] arr = new String[]{"哥哥", "姐姐", "弟弟", "妹妹", "爸爸", "妈妈"};

        //数组的复制
        String[] arr1 = new String[arr.length];
        for (int i = 0; i < arr1.length; i++) {
            arr1[i] = arr[i];
        }

        //数组的反转
        //方式一
//        for (int i =0 ;i<arr.length/2;i++){
//            String temp = arr[i];
//            arr[i] = arr[arr.length-i-1];
//            arr[arr.length-i-1]= temp;
//        }
        //方法二
        for (int i = 0, j = arr.length - 1; i < j; i++, j--) {
            String temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
        }
        //遍历
        System.out.println("反转数组:");
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i] + "\t");
        }

        //查找(或收索)
        //线性查找
        String dest = "姐姐";
        boolean isFlag = true;
        System.out.println("查找元素:");
        for (int i = 0; i < arr.length; i++) {
            if (dest.equals(arr[i])) {
                System.out.println("找到指定元素" + dest + ",位置为:" + i);
                isFlag = false;
                break;
            }
        }
        if (isFlag) {
            System.out.println("很遗憾没有找到!");
        }

        //二分法查找  前提:所要查找的数组必须有序。
        int[] arr2 = new int[]{  -99,-89,-1,12, 23, 44,45,66,67,98,100};

        int dest1 =-99;

        int head = 0;//初始的首索引
        int end = arr2.length - 1;//初始的末索引
        boolean isFlag1 = true;

        while (head <= end) {

            int middle = (head + end) / 2;

            if (dest1 == arr2[middle]) {
                System.out.println("找到了指定的元素,位置为:" + middle);
                isFlag1 = false;
                break;
            } else if (arr2[middle] > dest1) {
                end = middle- 1;
            } else {//arr2[middle]<dest1
                head = middle + 1;
            }
        }
        if (isFlag1) {
            System.out.println("很遗憾没有找到!");
        }
    }
}

结果:

反转数组:
妈妈	
爸爸	
妹妹	
弟弟	
姐姐	
哥哥	
查找元素:
找到指定元素姐姐,位置为:4
找到了指定的元素,位置为:0

(4)、数组元素的排序算法

在这里插入图片描述
在这里插入图片描述
算法的五大特征:
在这里插入图片描述
说明:满足确定性的算法也称为:确定性算法。现在人们也关注更广泛的概念,例如考虑各种非确定性的算法,如并行算法、概率算法等。另外,人们也关注并不要求终止的计算描述,这种描述有时被称为过程( procedure ) 。

冒泡排序

在这里插入图片描述

public class BubbleSortTest {
    public static void main(String[] args) {
        int[] arry = new int[]{43,32,21,4,56,77,89,900};

        //冒泡排序
        for (int i =0;i<arry.length-1;i++){
            for (int j =0;j<arry.length-1-i ; j++){
                if (arry[j]>arry[j+1]){
                    int temp = arry[j];
                    arry[j] = arry[j+1];
                    arry[j+1] = temp;
                }
            }
        }

        for (int i =0;i<arry.length;i++){
            System.out.println("冒泡排序:"+arry[i]+"\t");
        }

    }
}

结果:

4	
21	
32	
43	
56	
77	
89	
900	
快速排序

在这里插入图片描述

public class QuickSort {
    private static void swap(int[] data, int i, int j) {
        int temp = data[i];
        data[i] = data[j];
        data[j] = temp;
    }

    private static void subSort(int[] data, int start, int end) {
        if (start < end) {
            int base = data[start];
            int low = start;
            int high = end + 1;
            while (true) {
                while (low < end && data[++low] - base <= 0) ;
                while (high > start && data[--high] - base >= 0) ;
                if (low < high) {
                    swap(data, low, high);
                } else {
                    break;
                }
            }
            swap(data, start, high);

            subSort(data, start, high - 1);//递归调用
            subSort(data, high + 1, end);
        }
    }
    public static void quickSort(int[] data){
        subSort(data,0,data.length-1);
    }


    public static void main(String[] args) {
        int[] data = { 9, -16, 30, 23, -30, -49, 25, 21, 30 };
        System.out.println("排序之前:\n" + java.util.Arrays.toString(data));
        quickSort(data);
        System.out.println("排序之后:\n" + java.util.Arrays.toString(data));
    }
}

结果:

排序之前:
[9, -16, 30, 23, -30, -49, 25, 21, 30]
排序之后:
[-49, -30, -16, 9, 21, 23, 25, 30, 30]
各种内部排序方法性能比较

在这里插入图片描述
在这里插入图片描述

三、Arrays工具类的使用

在这里插入图片描述
代码实例:

import java.util.Arrays;

/**
 * @Description: $
 * @Author: dyq
 * @Date: $
 */
public class ArraysTest {
    public static void main(String[] args) {
        int[] arr1 = new int[]{1,2,3,4};
        int[] arr2 = new int[]{1,3,2,4};
        //1 boolean equals(int[] a,int[] b) 判断两个数组是否相等。
        boolean equals = arr1.equals(arr2);
        System.out.println(equals);

        //2 String toString(int[] a) 输出数组信息。
        System.out.println(Arrays.toString(arr1));

        //3 void fill(int[] a,int val) 将指定值填充到数组之中。
         Arrays.fill(arr1,10);
        System.out.println(Arrays.toString(arr1));

        //4 void sort(int[] a) 对数组进行排序。
        Arrays.sort(arr2);
        System.out.println(Arrays.toString(arr2));

        //5 int binarySearch(int[] a,int key) 对排序后的数组进行二分法检索指定的值。

       int[] arry1 = new int[]{2,3,5,8,11,13,17,19};
      int a =  Arrays.binarySearch(arry1,19);
        System.out.println(a);
    }
}

结果:

false
[1, 2, 3, 4]
[10, 10, 10, 10]
[1, 2, 3, 4]
7

四、数组使用中的常见异常

public class ArrayException {
    public static void main(String[] args) {
        int[] arr = new int[]{1,2,3,4};

//        for (int i=0;i <=arr.length;i++){
//            System.out.print(arr[i]+"\t");  //报异常ArrayIndexOutOfBoundsException数组角标越界异常
//        }
        //   System.out.println(arr[-1]);//报异常ArrayIndexOutOfBoundsException数组角标越界异常

        //空指针异常java.lang.NullPointerException
        //情况一:
//        int[] arr1 = new int[]{1,2,3,4,5};
//        arr1= null;
//        System.out.println(arr1[0]);

        //情况二:
//        int[][] arr2 =new int[4][];
//        System.out.println(arr2[0]); //null

        //情况三:
        String[] arr3 = new String[]{"AA","BB","CC"};
        arr3[0]=null;
        System.out.println(arr3[0].toString());
    }
}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北街风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值