Java数据结构和算法(二)——数组

数组的用处是什么呢?——当你需要将30个数进行大小排列的时候,用数组这样的数据结构存储是个很好的选择,当你是一个班的班主任的时候,每次要记录那些学生的缺勤次数的时候,数组也是很有用。数组可以进行插入,删除,查找等。

1)创建和内存分配

Java中有两种数据类型,基本类型和对象类型,也有人称为引用类型,Java中把数组当成对象,创建数组时使用new操作符。

int array[] = new int[10];

既然是对象,那么array便是数组的一个引用,根据Java编程思想(一) —— 一切都是对象 的内存分配,array会在栈中开辟空间,并且空间存储着保存数组存储的地址,真正保存对象的地方是对,new操作在堆中开辟了所需的空间,然后array指向头地址。

初始化:

public class UseArray {
    public static void main(String[] args) {
        int array[] = new int[10];
        System.out.println(array[2]);
        UseArray a[] = new UseArray[12];
        System.out.println(a[1]);
        int array2[] ={1,2,3,4,5,5,6};
    }
}

new后的数组里面的值被默认初始化为0,而对象的初始化是空的,null,当然还可以通过{}的方式初始化。

2)数组封装后的使用

public class UseArray {
    private int[] array;
    private int number = 0;
    public UseArray(int max){
        array = new int[max];
    }
    public void insert(int value){
        array[number] = value;
        number++;
    }
    public int find(int value){
        int index = 0;
        for (int i= 0; i < number; i++) {
            if(array[i]==value)
                return index;
        }
        return number;
    }

    public boolean delete(int value){
        int index = find(value);
        if(index != number){
            for (int i = index; i < number-1; i++) {
                array[i] = array[i+1];
            }
            number--;
            return true;
        }
        return false;
    }

    public void display(){
        for (int i = 0; i < number; i++) {
            System.out.printf(array[i]+" ");
        }
    }
    public static void main(String[] args) {
        UseArray ua  = new UseArray(5);
        ua.insert(1);
        ua.insert(2);
        ua.insert(6);
        ua.insert(7);
        ua.insert(3);

        ua.display();
        if(ua.find(5) != ua.number){
            System.out.println();
        }else{
            System.out.println("not found!");
        }
        if(ua.delete(5)!=true){
            System.out.println("can not delete!");
        }
        ua.display();
    }
}

将整个数组封装,用number代替数组的个数,插入数据的时候也不必理会往哪个下标插,当然,也可以自定义一个具体下标的方法。

方法比较简单就不介绍了,但是存在的一个缺点在delete那里,其实只是从删除元素开始的左移而已,所以,虽然number减少了,但是最后一个元素并没有删除掉,只是display输出展示的时候隐藏了而已,但是,下次插入元素的时候新元素便会取代掉最后一个元素的位置。

3)查找优化——二分查找

public int find(int value){
        int start = 0;
        int end = number-1;
        while(end>start){
            int index =(end + start)/2;
            if(array[index]==value){
                return index;
            }else if(array[index] >value){
                end = index-1;
            }else {
                start = index+1;
            }
        }
        return number;
    }

二分查找前提是数组已经有序。刚开始index写成end和start相减,造成死循环。其实要的是相加。1,2,3,6,7。index=2,value=7,3小于7,start=3,那么index要的是3和4间的中间数,所以是相加之后除以2,6小于7,start=4,find到7。

排序的话倒是看—— Java数据结构和算法(三)——简单排序

存储对象的话原理一样。

4)大O表示法

设N为数据总数,加入插入一个数据时间为K。

那么线性查找总时间T=K*N/2,因为查找的话大概为比较数目的一半。

二分查找的话T=k*log2(N)。

大O表示法,O可以看成是order of,大约是的意思,k/2也是常数,所以可以看成是O(N)。

数组的缺点呢,就是大小固定,查找慢,如果你要经常查找百万级别的数据,还会用数组吗?不会的,所以数据结构的选用要结合具体的实际情况,达到最大的效率值。

时间: 2024-08-02 10:59:17

Java数据结构和算法(二)——数组的相关文章

Java数据结构和算法之数组与简单排序

一.数组于简单排序 数组 数组(array)是相同类型变量的集合,可以使用共同的名字引用它.数组可被定义为任何类型,可以是一维或多维.数组中的一个特别要素是通过下标来访问它.数组提供了一种将有联系的信息分组的便利方法. 一维数组 一维数组(one‐dimensional array )实质上是相同类型变量列表.要创建一个数组,你必须首先定义数组变量所需的类型.通用的一维数组的声明格式是: type var‐name[ ]; 获得一个数组需要2步: 第一步,你必须定义变量所需的类型. 第二步,你必

Java数据结构与算法之数组

数组特点: 1.大小固定 2.同一数据类型 3.下标访问 4.数据项可重复 Java数据类型:基本类型(int和double)和对象类型.在许多编程语言中,数组也是基本类型.但在Java中把它们当作对象来对待,因此在创建数组时必须使用new操作符. 有序数组与无序数组比较:最主要的好处是查找速度比无序数组快多了.不好的方面是在插入操作中由于所有靠后的数据都需要移动以疼开空间,所以速度较慢.有序数组和无序数组数据中的删除操作都很慢,这是因为数据项必须向前移动来填补已删除数据项的空洞. 数据访问:从

《Java数据结构和算法》- 数组

Q: 数组的创建? A: Java中有两种数据类型,基本类型和对象类型,在许多编程语言中(甚至面向对象语言C++),数组也是基本类型.但在Java中把数组当做对象来看.因此在创建数组时,必须使用new操作符: int [] objArray = null; // defines a reference to an array objArray = new int[100]; // creates the array, and sets objArray to refer to it 或使用等价的

数据结构和算法二(数组)

一.数组 1.概念 数组是一种线性表数据结构,它用一种连续的内存空间,来存储一组具有相同类型的数据. 线性表:数组.链表.队列.栈等 非线性表:二叉树.堆.图等 2.连续的内存空间和相同类型的数据 优点:具有随机范文的特性,根据下标随机访问的时间复杂度为O(1) 缺点:低效的插入和删除 插入:最好O(1),最坏O(n),平均O(n) 插入:数组若无序,插入新的元素时,可以将第K个位置元素移动到数组末尾,把新的元素插入到第K个位置,此时复杂度为O(1) 删除:最好(1),最坏O(n),平均O(n)

JAVA数据结构与算法-稀疏数组

实际需求 分析问题 因为该二维数组的很多值是默认值0, 因此记录了很多没有意义的数据.->稀疏数组. 1.基本介绍 当一个数据中大部分元素为0,或者同一个值的数组时,可以使用稀疏数组来保存该数组稀疏数组处理方法 1.记录数组一共有几行几列,有多少不同的值 2.把具有不同的值的元素的行列及值记录在一个小规模的数组中,从而去缩小程序规模 稀疏数组说明 2.应用实例 使用稀疏数组,来保留类似前面的二维数组(棋盘.地图等等) 把稀疏数组存盘,并且可以从新恢复原来的二维数组数 整体思路分析 3.加了比较多

Java数据结构和算法(二)树的基本操作

Java数据结构和算法(二)树的基本操作 一.树的遍历 二叉树遍历分为:前序遍历.中序遍历.后序遍历.即父结点的访问顺序 1.1 前序遍历 基本思想:先访问根结点,再先序遍历左子树,最后再先序遍历右子树即根-左-右.图中前序遍历结果是:1,2,4,5,7,8,3,6. // 递归实现前序遍历 public void preOrder() { System.out.printf("%s ", value); if (left != null) { left.preOrder1(); }

Java数据结构与算法之集合

线性表.链表.哈希表是常用的数据结构,在进行Java开发时,SDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中. 一.Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object.一些Collection允许相同元素而另一些不行.一些能排序而另一些不行.Java  SDK不提供直接继承自Collection的类,Java  SDK提供的类都是继承自Collection的"子接口"如List和Set

Java数据结构和算法之链表

三.链表 链结点 在链表中,每个数据项都被包含在'点"中,一个点是某个类的对象,这个类可认叫做LINK.因为一个链表中有许多类似的链结点,所以有必要用一个不同于链表的类来表达链结点.每个LINK对象中都包含一个对下一个点引用的字段(通常叫做next)但是本身的对象中有一个字段指向对第一个链结点的引用. 单链表 用一组地址任意的存储单元存放线性表中的数据元素. 以元素(数据元素的映象)  + 指针(指示后继元素存储位置)  = 结点(表示数据元素 或 数据元素的映象) 以"结点的序列&q

java数据结构与算法之树基本概念及二叉树(BinaryTree)的设计与实现

[版权申明]未经博主同意,不允许转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53727333 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈(Stack)设