顺序表(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
- 顺序表(java)
- java数据结构(顺序表)
- Java实现线性表(顺序表)
- Java算法(顺序表操作实例)
- (1)顺序线性表(Java)
- 顺序表(ArrayList)java实现
- 数据结构之顺序表(java版)
- 线性表-顺序存储(Java数据结构)
- Java与数据结构(一) 顺序表
- 数据结构顺序表的定义(Java)
- java模仿顺序表
- 顺序表----java实现
- java实现顺序表
- JAVA实现顺序表
- JAVA数据结构---顺序表
- JAVA之顺序表
- 顺序表java实现
- Java实现顺序表
- Android开发——Activity启动模式详解
- 机器学习4 - 牛顿法求最值
- binlog,undo log,redo log
- 如何生成android的BKS证书
- 几种Kendo组件实例访问方式(Kendo Tip: Accessing Widget Instances)
- 顺序表(java)
- STM32F4采集核心板调试记录
- Android 中SharedPreferences跨应用读取数据的
- Apache HTTP Server 与 Tomcat jackey
- matrics Global Cache Blocks Lost
- 单元格的表示方式
- div.2/Bellovin<最长上升子序列>
- java中equals与==的区别
- 电脑的运行、控制面板、命令提示符被禁用的解决方案