zoukankan      html  css  js  c++  java
  • 一维数组


            一维数组
    一、数组的作用和类型
    1.作用
      A.存储 相同数据类型 的一组数据
      B.对同类型数据进行集中管理,比如储存和遍历
    2.数组类型
      A.数组的类型就是数据中存储的数据的类型
      B.数据本身是个对象(对象属于引用数据类型)
    注意:
      A.数组中的所有元素属于相同的数据类型
      B.数组中所有元素在内存中连续存储
    特点:数组本身也是一种引用类型
      A.数组名只是引用,指向堆中创建的数组对象,该对象保存一组其它引用或直接值

     

     

    二、声明、创建数组
    1.数组的声明
      A.告诉系统数据类型是什么
      B.语法: 数据类型[] 数组名;
    2.数组的创建
      A.为数组分配内存空间
        a.new操作符的使用
    3.声明并创建数组
      数据类型[] 数组名 = new 数据类型[大小];
      列:int[] arry = new int[3];
    4.数组的特点
      A.数组有一个字段length,表示此数组对象可以存储多个元素即数组长度;length不是实际保存的元素个数
      B.“[]”语法是访问数组对象成员的唯一方式
      C.对象数组保存的是引用,基本类型数组直接保存基本类型的值
      D.新生成的数组对象,其中所有的引用自动化初始化为null;基本类型数组成员有各自默认值(数值型自动初始化为 0,字符型为(char)0,布尔型为false,float/double型为0.0)

    三、初始化数组
    1.数组的初始化
      A.为数组中的成员一一赋值
    2.数组赋值的两种方式
      A.边声明边赋值(静态初始化)
        int[] score = {66,77,88};
        int[] score = new int[]{66,77,88};
      B.动态地获取(从键盘录入)信息并赋值
        int[] score = new int[3];
        Scanner input = new Scanner(System.in);
        for(int i=0 ;i<3;i++){
        score[i] = input.nextInt();
        }


    四、常用数组排序算法

    1.冒泡排序法
      工作原理:比较相邻的元素。如果第一个比第二个大,就交换它们两个。对每一对响铃元素做同样的工作,从开始第一对到结尾的最后一对。最后的元素应该会是最大的数。针对除了最后一个元素以外所有的原色重发以上的步骤。直到没有任何一对数字需要比较。

    总结:N个数,比较N-1轮,每轮比较N-1-i次。  

    代码示例:

     1 package com.sanlianxueuan;
     2 
     3 public class Demo7 {
     4 
     5     /**
     6      * 冒泡排序
     7      */
     8     public static void main(String[] args) {
     9         int [] array = {1,5,3,2,6,7,9,13,54,20};
    10         //N个数比较的论数N-1;
    11         for (int i=0;i<array.length-1;i++){
    12             //每一轮比较的次数N-1-i次;
    13             for(int j=0;j<array.length-1-i;j++){
    14                 //比较相邻的两个数,小的往前靠,大的往后移
    15                 if(array[j]>array[j+1]){
    16                     //两个数做交换,通过设置临时变量
    17                     int temp = array[j];
    18                     array[j] = array[j+1];
    19                     array[j+1] =temp;
    20                 }
    21             }
    22         }
    23         //把排好序的数组输出
    24         for(int i=0;i<array.length;i++){
    25             System.out.print(array[i]+" ");
    26         }
    27     }
    28 
    29 }

    2.选择排序法:
      工作原理:首先在为排序序列中找到最小元素,存放到排序序列的其实位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素觉排序完毕。

    代码示例:

     1 package com.sanlianxueuan;
     2 
     3 public class Demo8 {
     4 
     5     /**
     6      * 选择排序
     7      */
     8     public static void main(String[] args) {
     9         int [] array = {1,5,3,2,6,7,9,15,54,82};
    10         int min = 0;  //保存最小元素值的下标
    11         //N个数进行N-1轮的比较
    12         for(int i=0;i<array.length-1;i++){
    13             min = i; //以第一个数为最小值
    14             //查找最小数在数组中的下标
    15             for(int j=i+1;j<array.length;j++){
    16                 if(array[min] > array[j]){
    17                     min = j;
    18                 }
    19             }
    20             //如果第i个最小的数位置不在i上,则进行交换
    21             if(i != min){
    22                 int temp = array[i];
    23                 array[i] = array[min];
    24                 array[min] = temp;
    25             }    
    26          }
    27         for(int i=0;i<array.length;i++){
    28             System.out.print(array[i]+" ");
    29         }
    30     }
    31 
    32 }

    总结:N个数,比较N-1轮

    3.插入排序法:
      工作原理:它是通过构建有序序列,对于未排序数据,在已排序列中从后向前扫描,找到相应位置并插入。从后向前扫描过程中,需要反复吧已排序元素逐步向后挪位,为最新元素提供插入空间。

     代码示例:

     1 package com.sanlianxueuan;
     2 
     3 public class Demo9 {
     4 
     5     /**
     6      * 插入排序
     7      */
     8     public static void main(String[] args) {
     9         int [] array = {20,25,15,42,36,16,12};
    10         for(int i=1;i<array.length;i++){
    11             int temp = array[i];
    12             //把下标保存起来
    13             int j=i;
    14             while(j>0&&temp<array[j-1]){
    15                 //上面的数覆盖下面的数
    16                 array[j] = array[j-1];
    17                 j--;
    18             }
    19             array[j]=temp; //插入数据
    20         }
    21         for(int i=0;i<array.length;i++){
    22             System.out.print(array[i]+" ");
    23         }
    24     }
    25 
    26 }

    五、常用数组查找算法
    1.线性查找法:
      工作原理:它又称之为顺序查找。在一列给定的值中进行搜索,从一端开始注意查询每个元素,知道返回所需元素的过程。
      例:A.查找指定的数在数组中出现的位置,找到返回下标,找不到返回-1;
        B.求数组中的最大值,最小值

    代码示例:

     1 package com.sanlianxueuan;
     2 
     3 import java.util.Scanner;
     4 
     5 public class Demo4 {
     6 
     7     /**
     8      * 查找指定的数在数组中出现的位置,找到返回下标,找不到返回-1;
     9      */
    10     public static void main(String[] args) {
    11         int[] array = {10,20,80,60,50,90,70,30};
    12         Scanner input = new Scanner(System.in);
    13         System.out.println("请输入一个数:");
    14         int number = input.nextInt();
    15         int index =-1;   //保存找到的数所在数组中的下标,找不到等于-1;
    16         for(int i=0;i<array.length;i++){
    17             if(number == array[i]){
    18                 index = i+1;
    19                 break;
    20             }
    21         }
    22         
    23         if(index != -1){
    24             System.out.println("你要查找的数在第"+index+"位");
    25         }else{
    26             System.out.println("你要查找的数不在该数组内");
    27         }
    28             
    29     }
    30         
    31 
    32 }

    2.二分法查找:-----针对的是有序的数据
      工作原理:它又称之为折半查找法。讲数组中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置将数组分成前、后两个子数组,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子数组,否则进一步查找后一子数组。重复以上过程知道找到或者找不到为止。

    代码示例:

     1 package com.sanlianxueuan;
     2 
     3 import java.util.Scanner;
     4 
     5 public class Demo6 {
     6 
     7     /**
     8      * 二分法查找
     9      */
    10     public static void main(String[] args) {
    11         int [] array ={1,2,3,4,5,6,7,8,9,18,49,87,90};
    12         System.out.println("请输入要查找的数:");
    13         Scanner input = new Scanner(System.in);
    14         int number = input.nextInt();
    15         int index = -1;   //保存找到数所在数组中的下标,找不到等于-1
    16         int start = 0;   //起始下标
    17         int end = array.length-1;  //终止下标
    18         int middle;
    19         while(start<end){
    20             //找到中间下标所对应的元素值
    21             middle = (start+end)/2;
    22             if(number == array[middle]){
    23                 index = middle+1;
    24                 break;
    25             }
    26             //假如要查找的那个数大于中间比较的那个数
    27             //去掉左边的数
    28             if(number > array[middle]){
    29                 start = middle+1;
    30                 
    31             }
    32             //保留左边的数,去掉右边的数
    33             if(number < array[middle]){
    34                 end = middle - 1;
    35                 
    36             }
    37         }
    38         if(index != -1){
    39             System.out.println("要找的数在"+index+"位");
    40         }
    41         
    42         if(index == -1){
    43             System.out.println("not find");
    44         }
    45 
    46     }
    47 
    48 }

    六、Arrays类使用
    java的jdk中提供了一个Arrays工具类,此类专门为程序员操作数组提供了很多专有的方法,通过方法的调用可以对数组进行复制、排序、比较、查找元素等功能。

     代码示例:

     1 package com.sanlianxueuan;
     2 
     3 import java.util.Arrays;
     4 
     5 public class Demo10 {
     6 
     7     /**
     8      * Array类的引用
     9      */
    10     public static void main(String[] args) {
    11         int [] arraySrc1 = {1,3,4,5,6,2};
    12         //拷贝数组
    13         //参数说明:第一个是要拷贝的数组名,第二个是数组的长度
    14         int [] arrayDes1 = Arrays.copyOf(arraySrc1, 10);
    15         for(int i=0; i<arrayDes1.length;i++){
    16             System.out.print(arrayDes1[i]+" ");
    17         }
    18         
    19         System.out.println("
    *******************");
    20         //拷贝指定数组中的指定范围内的数据
    21         //参数说明:第一个是要拷贝的数组,第二个是要拷贝的起始位置下标,第三个是拷贝结束的数组下标
    22 /*        注意:数组的长度是第三个参数-第二个参数*/
    23         int [] arrayDes2 = Arrays.copyOfRange(arraySrc1, 2, 4);
    24         for(int i=0; i<arrayDes2.length;i++){
    25             System.out.print(arrayDes2[i]+" ");
    26         }
    27         //数组的比较
    28         System.out.println("
    *******************");
    29         int [] arraySrc2 = {1,3,5,6,2};
    30         boolean flag = Arrays.equals(arraySrc1, arraySrc2);
    31         System.out.println(flag);
    32         
    33         //数组的填充
    34         System.out.println("
    *******************");
    35         int [] arrayDes3 = new int[10];
    36         //Arrays.fiil(arrayDes3,10);
    37         //参数说明:第一个参数是要填充的数组,第二个是要填充的起始位置,
    38         //第三个是要填充的终止位置,第四个是要填充的数
    39         Arrays.fill(arrayDes3,1,5, 10);
    40         for(int i=0; i<arrayDes3.length;i++){
    41             System.out.print(arrayDes3[i]+" ");
    42         }
    43         
    44         //对数组进行排序
    45         System.out.println("
    *******************");
    46         Arrays.sort(arraySrc1);
    47         for(int i=0; i<arraySrc1.length;i++){
    48             System.out.print(arraySrc1[i]+" ");
    49         }
    50         
    51         //二分法查找
    52         System.out.println("
    *******************");
    53         int index = Arrays.binarySearch(arraySrc1, 5);
    54         System.out.println(index);
    55         
    56         //使用System这个类的方法来拷贝数组
    57         System.out.println("
    *******************");
    58         int [] arrayDes5 = new int [10];
    59         System.arraycopy(arraySrc1, 0, arrayDes5, 2, 5);
    60         for(int i=0; i<arrayDes5.length;i++){
    61             System.out.print(arrayDes5[i]+" ");
    62         }
    63     }
    64 
    65 }
  • 相关阅读:
    [C++11新特性] weak_ptr和unique_ptr
    [C++11新特性] shared_ptr共享的智能指针
    VS2019 Qt5.15.2 开发环境搭建
    【C++11 新特性】Lambda表达式(三)
    【C++11 新特性】bind(二)
    【C++11 新特性】function(一)
    【IPC 进程间通信】有名管道的简单实现
    【IPC 进程间通信】常用进程间通信方式总结
    Qt 文件常见操作管理类
    【GitHub 开源分享】QML 在线预览工具
  • 原文地址:https://www.cnblogs.com/lixiaokang-blog/p/7276012.html
Copyright © 2011-2022 走看看