第2章 数组

2.1 数组概念

数组是一种线性表数据结构,它用一组连续的内存空间,来存储一组具有相同类型的数据。这里我们要抽取出三个跟数组相关的关键词:线性表,连续内存空间,相同数据类型;数组具有连续的内存空间,存储相同类型的数据,正是该特性使得数组具有一个特性:随机访问。但是有利有弊,这个特性虽然使得访问数组边得非常容易,但是也使得数组插入和删除操作会变得很低效,插入和删除数据后为了保证连续性,要做很多数据搬迁工作。

查找数组中的方法有两种

  • 线性查找:线性查找就是简单的查找数组中的元素
  • 二分法查找:二分法查找要求目标数组必须是有序的。

2.2 无序数组

  • 实现类

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

public class MyArray {

    //声明一个数组

    private long[] arr;

    

    //有效数据的长度

    private int elements;

    

    //无参构造函数,默认长度为50

    public MyArray(){

        arr = new long[50];

    }

    

    public MyArray(int maxsize){

        arr = new long[maxsize];

    }

    

    

    //添加数据

    public void insert(long value){

        arr[elements] = value;

        elements++;

    }

    

    //显示数据

    public void display(){

        System.out.print("[");

        for(int i = 0;i < elements;i++){

            System.out.print(arr[i] + " ");

        }

        System.out.println("]");

    }

    

    //根据下标查找数据

    public long get(int index){

        if(index >= elements || index < 0){

            throw new ArrayIndexOutOfBoundsException();

        }else{

            return arr[index];

        }

    }

    

    /**

     * 根据值查询

     * @param value 需要被查询的值

     * @return 被查询值的下标

     */

    public int search(int value){

        //声明一个变量i用来记录该数据的下标值

        int i ;

        for(i = 0;i < elements;i++){

            if(value == arr[i]){

                break;

            }

        }

        //如果查询到最后一个元素依然没有找到

        if(i == elements){

            return -1;

        }else{

            return i;

        }

    }

    

    //根据下标删除数据

    public void delete(int index){

        if(index >= elements || index < 0){

            throw new ArrayIndexOutOfBoundsException();

        }else{

            //删除该元素后,后面所有元素前移一位

            for(int i = index; i < elements;i++){

                arr[i] = arr[i+1];

            }

            elements--;

        }

        

    }

    /**

     * 替换数据

     * @param index 被替换的下标

     * @param newvalue 新的数据

     */

    public void change(int index,int newvalue){

        if(index >= elements || index < 0){

            throw new ArrayIndexOutOfBoundsException();

        }else{

            arr[index] = newvalue;

        }

    } }

  • 优点:插入快(时间复杂度为:O(1))、如果知道下标,可以很快存储
  • 缺点:查询慢(时间复杂度为:O(n))、删除慢

2.3 有序数组

  • 实现类

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

public class MyOrderArray {

    private long[] arr;

    

    private int elements;

    

    public MyOrderArray(){

        arr = new long[50];

    }

    

    public MyOrderArray(int maxsize){

        arr = new long[maxsize];

    }

    

    //添加数据

    public void insert(int value){

        int i;

        for(i = 0;i < elements;i++){

            if(arr[i] > value){

                break;

            }

        }

        for(int j = elements;j > i;j--){

            arr[j] = arr[j -1];

        }

        arr[i] = value;

        elements++;

    }

    

    

    //删除数据

    public void delete(int index){

        if(index >=elements || index <0){

            throw new ArrayIndexOutOfBoundsException();

        }else{

            for(int i = index;i < elements; i++){

                arr[i] = arr[i+1];

            }

            elements--;

        }

    }

    

    //修改数据

    public void change(int index,int value){

        if(index >= elements || index < 0){

            throw new IndexOutOfBoundsException();

        }else{

            arr[index] = value;

        }

    }

    

    //根据下标查询数据

    public long get(int index){

        if(index >= elements || index < 0){

            throw new IndexOutOfBoundsException();

        }else{

            return arr[index];

        }

    }

    

    //展示数据

    public void display(){

        System.out.print("[");

        for(int i = 0; i < elements;i++){

            System.out.print(arr[i] + " ");

        }

        System.out.println("]");

    }

    

    

    //二分法查找数据

    public int binarySearch(long value){

            //声明三个指针分别指向数组的头,尾,中间

            int low = 0;

            int pow = elements;

            int middle = 0;

            

            while(true){

                middle = (low + pow) / 2;

                //如果中指针所指的值等于带查询数

                if(arr[middle] == value){

                    return middle;

                }else if(low > pow){

                    return -1;

                }else{

                    if(arr[middle] > value){

                        //待查询的数在左边,右指针重新改变指向

                        pow = middle-1;

                    }else{

                        //带查询的数在右边,左指针重新改变指向

                        low = middle +1;

                    }

                }

            }

    }}

  • 优点:查询快(时间复杂度为:O(logn)
  • 缺点:增删慢(时间复杂度为:O(n)

Java数据结构与算法3相关推荐

  1. Java 数据结构与算法系列之冒泡排序

    一.前言 相信大部分同学都已经学过数据结构与算法这门课了,并且我们可能都会发现一个现象就是我们所学过的数据结构与算法类的书籍基本都是使用 C 语言来写的,好像没见过使用 Java 写的数据结构与算法. ...

  2. Java数据结构与算法——树(基本概念,很重要)

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 有网友私信我,期待我的下一篇数据结构.非常荣幸文章被认可,也非常感谢你们的监督. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督 ...

  3. Java数据结构与算法——插入排序

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本篇文章介绍排序算法中插入排序算法,包括插入排序的思路,适用场景,性能分析,ja ...

  4. Java数据结构和算法(六)——前缀、中缀、后缀表达式

    前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...

  5. Java数据结构和算法(一)——简介

    本系列博客我们将学习数据结构和算法,为什么要学习数据结构和算法,这里我举个简单的例子. 编程好比是一辆汽车,而数据结构和算法是汽车内部的变速箱.一个开车的人不懂变速箱的原理也是能开车的,同理一个不懂数 ...

  6. JAVA数据结构与算法【简单介绍】

    前几天去面一个大厂,面试官特别好,面试官说到,我们的学习不能本末倒置,数据结构和算法是程序的基础,如果数据结构你没有学好,你真正意义上不算会写代码.你的代码是各处粘贴,杂乱无章的. 由于现在大多用JA ...

  7. java算法概述,Java数据结构与算法基础(一)概述与线性结构

    Java数据结构与算法基础(二)递归算法 Java数据结构与算法基础(一)概述与线性结构 学习目的:为了能更顺畅的读很多底层API代码和拓宽解决问题的思路 一.数据结构概述 1.数据结构是什么?数据与 ...

  8. 【笔记】Java数据结构与算法

    [笔记]Java数据结构与算法 文章目录 [笔记]Java数据结构与算法 1.八大排序应用场景 2.未完待续-- 1.八大排序应用场景 冒泡排序:优化后的冒泡排序可用于当数据已经基本有序,且数据量较小 ...

  9. 二叉树 BinaryTree (先序、中序、后序遍历 节点查找、插入、删除 完整类) Java数据结构与算法

    二叉树 BinaryTree (先序.中序.后序遍历 节点查找.插入.删除 完整类) Java数据结构与算法 源代码: view plain /** * * @author sunnyykn */ i ...

  10. Java数据结构和算法(四)--链表

    日常开发中,数组和集合使用的很多,而数组的无序插入和删除效率都是偏低的,这点在学习ArrayList源码的时候就知道了,因为需要把要 插入索引后面的所以元素全部后移一位. 而本文会详细讲解链表,可以解 ...

最新文章

  1. 使用VC 2010制作和使用静态库
  2. linux之ftp怎么把本地文件拷贝到服务端
  3. 【代码笔记】Web-ionic-select
  4. 初一计算机下册理论知识,初中信息技术七年级下册(第七版)
  5. class-dump获取iOS私有api
  6. sublime编辑器下载与安装过程 2020
  7. 前端开发 html常用标签 0229
  8. mysql mvcc 的理解
  9. 让一个数字显示指定位数
  10. 【渝粤教育】国家开放大学2018年春季 8618-21T燃气行业规范 参考试题
  11. adb通过USB或wifi连接手机
  12. 1分钟链圈 | 硅谷和成都互设科技金融中心;帅初:区块链更容易落地游戏和版权行业;区块链底层技术布局基本完成
  13. Linux 系统中如何恢复已删除的文件?
  14. 云流化是什么?对软件企业有什么好处?
  15. mt管理器去除应用广告
  16. HDFS文件系统的基础理论,HDFS工作者和管理者的分配,HDFS文件存储容量的理解
  17. Python 跨类传参与跨模块传参
  18. Vue项目清理本地缓存并删除node_modules (清除不掉揍我)
  19. 朴素贝叶斯文本分类java_朴素贝叶斯文本分类简单介绍
  20. 如何做好软件维护工作

热门文章

  1. php 编号自动填充,word序号怎么自动填充
  2. mptcp协议参数解析
  3. 【代码分享】TRL微波器件测量去嵌入校准–程序代码
  4. 行业例会2023第13届中国(上海)国际发泡材料展览会
  5. 自留 校招 面试 用
  6. iOS12 AVPlayer播放视频 AVFoundationErrorDomain Code=-11800
  7. 机械原理葛文杰P47页牛头刨床运动分析代码,画图精致
  8. Ace2005英文数据解析过程(事件抽取)
  9. 小球反弹(一小球从100米自由下落)
  10. 生物医药实验室规划设计方案SICOLAB