首页 > 编程语言 >数组的常见操作及其算法

数组的常见操作及其算法

时间:2023-07-25 13:31:53浏览次数:35  
标签:元素 int 常见 System 算法 数组 length out

一、数组的常见操作

1、定义一个int类型的数组,里面包含10个元素,分别赋一些随机数,然后求出这10个元素的最大值、最小值、总和、平均值。
注:随机数公式:(数据类型)(最小值+Math.random()*(最大值-最小值+1))
    public static void test01(){
        //创建一维数组
        int[] arrList = new int[10];
        //赋区间随机值
        for (int i = 0; i < arrList.length; i++) {
            arrList[i] = (int)(Math.random() * (99 - 10 + 1) + 10);
        }
        //求最大值
        int max = arrList[0];      //为了避免出现问题,最好将默认值设为数组中的一个元素
        for (int i = 0; i < arrList.length; i++) {
            if(arrList[i] > max){
                max = arrList[i];
            }
        }
        //求最小值
        int min = arrList[0];
        for (int i = 0; i < arrList.length; i++) {
            if(arrList[i] < max){
                min = arrList[i];
            }
        }
        //求总和
        double sum = 0;
        for (int i = 0; i < arrList.length; i++) {
            sum += arrList[i];
        }
        //求平均值
        double average = sum / arrList.length;
        //首先输出这个数组
        System.out.print("这个数组序列为:");
        for (int i = 0; i < arrList.length; i++) {
            System.out.print(arrList[i] + "\t");
        }
        System.out.println("");
        System.out.println("最大值为:" + max);
        System.out.println("最小值为:" + min);
        System.out.println("总和为:" + sum);
        System.out.println("平均值为:" + average);
    }
2、数组元素的赋值
案例1:使用二维数组打印一个10行的杨辉三角
代码如下所示:
     /**
      * 杨辉三角
      * 规律:
      * 第一列全部是1,每一行的最后一个元素为1
      * 每一行从第二个元素开始,它的值等于头上两个数之和(偏左的两个数)
      *
      * */
     public static void test04(){
         //创建10行的二维数组
         int[][] yangHui = new int[10][];
         //初始化外层数组元素并且赋值
         /**
          * 给数组元素赋值
          *     1、给每行的首末元素赋值为1(在创建数组的时候就进行赋值)
          *     2、给非首末元素赋值:就是每一行从第二个元素开始,它的值等于头上两个数之和(偏左)
          * */

         for (int i = 0; i < yangHui.length; i++) {
             yangHui[i] = new int[i + 1];
             //给首末元素赋值
             yangHui[i][0] = 1;     //每行的首个元素为1
             yangHui[i][i] = 1;     //每行的末尾元素为1
             //给非首末行元素赋值
             for (int j = 1; j < yangHui[i].length-1; j++) {
                 yangHui[i][j] = yangHui[i-1][j] + yangHui[i-1][j-1];   //杨辉三角的规律
             }
         }
         //遍历此时的二维数组,输出杨辉三角
         for (int i = 0; i < yangHui.length; i++) {
             for (int j = 0; j < yangHui[i].length; j++) {
                 System.out.print(yangHui[i][j] + "\t");
             }
             System.out.println();
         }
     }
案例2:创建一个长度为6int类型的数组,要求数组元素的值都在1-30之间,且是随机赋值。同时满足数组里面的各个元素互不相同。
/**
     * 解决思路:如果后面那个元素等于前面那个元素,就重新赋值
     * */
    public static void test05() {
        //创建一维数组
        int[] arr = new int[6];
        //给一维数组赋值,按照条件赋值
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int) (Math.random() * (30 - 1 + 1) + 1);
            if (i != 0) {
                //如果后面那个元素等于前面那个元素,就重新赋值
                while (arr[i - 1] == arr[i]) {
                    arr[i] = (int) (Math.random() * (30 - 1 + 1) + 1);
                }
            }
        }
        //输出此时的一维数组
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + "\t");
        }
    }
案例3:回形数
例:从键盘输入一个整数(1-20),则以该数字为矩阵的大小,把1,2,3..n^2的数字按照顺时针螺旋的形式填入举证中。
例如:输入数字4,则输出:
1	2	3	4
12  13  14	5
11  16 	15	6
10  9	8	7
3、数组元素的复制、反转
4、数组的扩容与缩容

二、关于数组的常见算法

1、二分查找

代码如下:

    /**
     * 二分查找
     * 前提:序列是有序的
     */
    public static void test06() {
        //给出一个有序数组
        int[] a = new int[]{1, 5, 7, 9, 13, 18, 21, 26, 29, 30};
        //给出需要查找的目标数据
        int target = 7;
        //给出首末索引
        int head = 0;               //首索引
        int end = a.length - 1;     //末索引
        //结束条件是首索引小于等于末索引(或者定义判断的标志)
        boolean isFind = false;     //判断标志
        int index = 0;              //记录查找元素的下标
        while (!isFind) {
            //定义中间元素的索引
            int middle = (head + end) / 2;
            if (target == a[middle]) {
                index = middle;
                isFind = true;
                break;
            } else if (target > a[middle]) {    //如果目标元素比中间元素大,就让首指针指向后一个元素
                head = middle + 1;
            } else {
                end = middle - 1;
            }

        }
        if (isFind) {
            System.out.println("查找的目标元素为:" + a[index] + " 它在数组中的索引为:" + index);
        } else {
            System.out.println("没有找到相关元素!");
        }

    }
2、排序
衡量排序算法的优劣

时间复杂度!

空间复杂度:需要使用的辅助内存空间的大小

稳定性:若两个记录A和B的关键字值相等,但排序后A、B的先后次序保持不变,则称这种排序算法是稳定的

2.1冒泡排序

==时间复杂度:O(n^2)==

代码如下所示:

    /**
     * 冒泡排序
     * 动图可见如下博客:http://t.csdn.cn/7dIJi
     */
    public static void test07() {
        //生成一个随机10位的随机序列
        int[] a = new int[10];
        for (int i = 0; i < a.length; i++) {
            a[i] = (int) (Math.random() * (100 - 1 + 1) + 1);
        }
        System.out.print("排序前的序列为:");
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + "\t");
        }
        System.out.println();
        //然后对这个序列进行冒泡升序排序
        for (int i = 0; i < a.length; i++) {
            boolean flag = true;           //用于判断原序列是否已经排好序,假设已排好
            for (int j = 0; j < a.length - i - 1; j++) {
                int temp = 0;
                if (a[j] > a[j + 1]) {
                    temp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = temp;
                    
                    //进入if判断语句,则说明原序列没有排好序,则需要修改排序判断标志
                    flag = false;
                }
            }
            //如果flag为true,说明没有进入if判断语句里面,即没有进行排序,说明原序列已经是有序
            if(flag){
                break;
            }
        }
        //循环输出排序后的序列
        System.out.print("排序后的序列为:");
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + "\t");
        }
        System.out.println();
    }

2.2快速排序:20世纪十大算法之一

==时间复杂度:O(nlog2 n)==

基本思想:在一个序列中,随机挑选出一个数字(假设挑选第一个),然后将序列中的数字与它比较,比它小的放右边,比它大的放左边,然后在左右两边的序列中又各找一个数字出来,分别再次执行上述操作,直到最后排列完成

具体实现代码如下:

public class quickSub {
    public static void main(String[] args) {
        int[] arr = {3,5,2,1,43,33,22,64,74,25,13,27,98,56,100,21,7};
        quickSort(arr);
        for(int x : arr){
            System.out.print(x + " ");
        }
 
    }
 
    public static void quickSort(int[] array){
        quick(array,0,array.length-1);
    }
 
    private static void quick(int[] array, int left, int right) {
 
        //递归结束条件:这里代表只有一个根   大于号:有可能没有子树  1  2  3   4  1为基准,pivot-1就越界了
        if(left >= right){
            return;
        }
 
        int pivot = partition(array, left, right);
        quick(array,left,pivot-1);
        quick(array,pivot+1,right);
    }
 
    public static int partition(int[] array,int start, int end){
        int i = start;//这里存开始时基准的下标,为了循环结束后,相遇值和基准值交换时能找到基准值的下标
        int key = array[start];//这是基准
        while (start < end){
            while (start < end && array[end] >= key){
                end--;
            }
            while (start < end && array[start] <= key){
                start++;
            }
            swap(array,start,end);
        }
        //到这里s和e相遇,把相遇值和基准值交换
        swap(array,start,i);
        return start;//返回基准下标
    }
 
    public static void swap(int[] array, int n, int m){
        int temp = array[n];
        array[n] = array[m];
        array[m] = temp;
    }
 
}

标签:元素,int,常见,System,算法,数组,length,out
From: https://blog.51cto.com/u_15433911/6844486

相关文章

  • HJ67 24点游戏算法
    1.题目读题 HJ67 24点游戏算法 考查点 2.解法思路 代码逻辑 具体实现importjava.util.Scanner;importjava.util.Arrays;publicclassHJ67{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);whil......
  • LKT(LCS)系列IIC接口加密芯片调试常见问题(一)
    1、加密芯片的数据交互协议是什么格式?发送时:地址+两字节数据长度(后续数据的长度)+后续数据内容。Eg.5000050084000008。接收时:地址+两字节数据长度(后续数据的长度)+后续数据内容。Eg.51 000A11223344556677889000。(红色为发送,蓝色为接收) 2、主控端发完指令后无Stop信号可以......
  • 拆解雪花算法生成规则
    1介绍雪花算法(Snowflake)是一种生成分布式全局唯一ID的算法,生成的ID称为SnowflakeIDs或snowflakes。这种算法由Twitter创建,并用于推文的ID。目前仓储平台生成ID是用的雪花算法修改后的版本。雪花算法几个特性生成的ID分布式唯一和按照时间递增有序,毫秒数在高位,自增序列在低......
  • 基于协同过滤推荐算法-手语学习系统-项目实战
    我发布此篇文章有两个博客地址博客园:https://www.cnblogs.com/liuyangjava/p/17579030.htmlCSDN:https://blog.csdn.net/caleb_520/article/details/131899297?spm=1001.2014.3001.5502课程视频预览:【【毕设项目】基于协同过滤推荐算法-手语学习系统/2023年新课程】https://www......
  • Java3DES双倍长加密算法详解
     Java3DES双倍长加密算法是一种强大的加密算法,它可以保护我们的敏感数据不被未经授权的人访问。在本文中,我将详细介绍Java3DES双倍长加密算法的原理和使用方法。首先,让我们来了解一下Java3DES双倍长加密算法的原理。这种算法是基于DES(DataEncryptionStandard)算法的改进版本......
  • 翻转 实现数组元素倒序的方法
     在Java编程开发中,经常会遇到需要对数组进行操作的情况。其中一个常见的需求就是实现数组元素的倒序。本文将介绍一种简洁高效的方法来实现这个功能。在开始之前,我们需要先了解一下数组的基本概念。数组是一种容器,可以存储多个相同类型的数据。数组的元素可以通过索引来访问,索......
  • Java 字符串转整形数组的方法及注意事项
     在Java编程中,经常会遇到需要将字符串转换为整形数组的情况。这是一个常见的操作,它可以帮助我们更方便地处理数据。本文将介绍一些常见的方法和注意事项,以帮助您顺利完成字符串转整形数组的任务。方法一:使用split()方法split()方法是Java中常用的字符串分割方法,它可以按照指......
  • 左神算法-基础06-图
    左神算法-基础06-图图的存储方式邻接表邻接矩阵如何表达图?生成图?//图的节点publicclassNode{publicintvalue;//入度publicintin;//出度publicintout;publicArrayList<Node>nexts;publicArrayList<Edge>edges;......
  • 常见的导致PG创建索引慢的原因
    1.表的大小问题如果表的数据很多,索引建立在大表上的时候,会导致建索引的时间很慢。所以如果表的数据量很多,可以考虑重新设计表结构或拆分表。可以考虑使用分区表,使用分区表来分割数据。这样在建立索引时,可以只对需要建立索引的分区进行操作,从而提高索引建立的速度。2.索引类型不同类......
  • 文心一言 VS 讯飞星火 VS chatgpt (65)-- 算法导论6.5 4题
    四、在MAX-HEAP-INSERT的第2行,为什么我们要先把关键字设为-∞,然后又将其增加到所需的值呢?文心一言:在MAX-HEAP-INSERT算法的第二行将关键字设为-∞,是为了保持堆的性质。堆是一种二叉树结构,其中每个节点的值都大于或等于其子节点的值。在MAX-HEAP-INSERT算法中,我们需要在......