顺序表(java)

来源:互联网 发布:亩和平方米精准算法 编辑:程序博客网 时间:2024/06/07 23:28

什么是顺序表

用一组<地址连续的存储单元>依次存储线性表的数据元素。
LOC(a(i+1))=LOC(a(i))+L
L表示每个元素a(i)所占的存储单元的大小。

特性

只要确定其实位置(内存地址),便可以随机存取(通过数组下标)。
因为每个元素的<物理位置相邻>

实现

顺序表在java语言中可以用数组来实现,我们看一下java的数组在内存中的结构:
数组是通过new创建的,也算一种对象,当一个对象通过 new 创建,就在堆内存中分配一段空间,并且返回其引用(堆内存地址),而栈内存中的某个地址就放着这个堆内存地址的值,也就是这个数组的引用。

代码实现

1、定义一个学生类

package com.sequenceList.study;public class Student {    private int id;    private String name;    private int age;    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }}

2、定义一个顺序表类

package com.sequenceList.study;import java.util.Arrays;public class SquenceList {    private Student[] students = null;    private int listSize ;    //顺序表的大小    private int current;     //当前顺序表中元素个数    public void initList(int size){        this.listSize=size;        this.current=0;        setStudents(new Student[size]);    }    public void destroyList(){        this.students = null;        this.current=0;        this.listSize= 0;    }    public void clearList(){        Arrays.fill(students, null);//将数组students中的每个元素都赋值null        this.current=0;        this.listSize = 0;    }    public boolean isEmpty(){        if(this.current==0){            return true;        }else{            return false;        }    }    public int getLength(){        return this.current;    }    public Student getElem(int i){        if(i<=this.current){            return this.students[i-1];        }else{            return null;        }    }    public Student getPrior(int i){        if((this.current==0)||(i==1)||(i>current)){            return null;        }else{            return students[i-2];        }    }    public Student getNext(int i){        if((this.current==0)||(i==current)||(i<1)){            return null;        }else{            return students[i];        }    }    public boolean insertList(Student a,int i){        if((i>this.current+1)||(i<1)){            return false;        }else if((i==this.current+1)&&(i<=this.listSize)){            this.students[i-1] = a;            this.current++;            return true;        }else if((i>0)&&(i<=this.current)){            for(int j=current;j>i;j--){                this.students[j]=this.students[j-1];            }            this.students[i-1]=a;            this.current++;            return true;        }else return false;    }    public boolean deleteList(int i){        if((i<1)&&(i>this.current)){            return false;        }else if((i==this.current)){            students[i-1] = null;            this.current--;            return true;        }else{            for(int j=i;j<this.current;j++){                students[j-1] = students[j];            }            this.current--;            return true;        }    }    public void visitList(){        for(int i=0;i<this.current;i++){            System.out.println(this.students[i].getName());        }    }    // ---------以上为自己写的顺序表的属性和方法------    public int getListSize() {        return listSize;    }    public void setListSize(int listSize) {        this.listSize = listSize;    }    public Student[] getStudents() {        return students;    }    public void setStudents(Student[] students) {        this.students = students;    }            }

3、测试

package com.sequenceList.study;public class Test {public static void main(String[] args){    SquenceList students = new SquenceList();    students.initList(5);    System.out.println(students.getLength());    System.out.println(students.getListSize());    System.out.println(students.isEmpty());    Student a = new Student();    a.setName("李科");    students.insertList(a,1);    students.visitList();    System.out.println(students.getLength());    System.out.println(students.getListSize());    System.out.println(students.isEmpty());    Student b = new Student();    b.setName("李科科");    students.insertList(b,2);    students.visitList();    System.out.println(students.getLength());    System.out.println(students.getListSize());    System.out.println(students.isEmpty());    System.out.println(students.getNext(1).getName());    System.out.println(students.getPrior(2).getName());    System.out.println(students.deleteList(1));    System.out.println(students.getLength());    System.out.println(students.getListSize());    System.out.println(students.isEmpty());    students.visitList();    students.clearList();    System.out.println(students.getLength());    System.out.println(students.getListSize());    System.out.println(students.isEmpty());    students.visitList();    }}

4、运行结果

05true李科15false李科李科科25false李科科李科true15false李科科00true

好吧我承认测试代码的可读性太差了。

时间复杂度(设顺序表长度为n)

查找一个元素:O(N)
如果这个顺序表中的元素没有规律,那么查找一个元素最坏的情况遍历所有结点,所以时间复杂度为O(N)。
插入一个元素:O(N)
最坏的情况,如果插入的元素在表的第一个位置,那么这n个元素都需要向后移,所以时间复杂度为O(N)。
删除一个元素:O(N)
最坏的情况,如果删除的也是表首元素,那么其余n-1个元素都要往前移一个位置,所以时间复杂度为O(N)。

优点

  • 支持随机访问(通过下标)
  • CPU高速缓存效率更高

缺点

  • 插入和删除数据的效率低

附:

java中的ArrayList的底层也是基于数组实现的,其中的很多方法和我写的顺序表中的方法类似,今后会学习并总结一篇专门讲解java的ArrayList类源码的文章。

我们继续探索链表吧!

1 0
原创粉丝点击