java数据结构和算法-02-数组

java数据结构和算法-02-数组

1.java中数组的基础知识

数组是编程语言重要的数据结构之一,java中用数组来存储固定大小的同类型元素.

1)数组需要先声明才可以使用

dataType[] arrayRefVar; // 首选的方法 

 dataType arrayRefVar[]; // 效果相同,但不是首选方法

2)创建数组

arrayRefVar = new dataType[arraySize];

3)声明和创建数组一步完成

dataType[] arrayRefVar = new dataType[arraySize];

dataType[] arrayRefVar = {value0, value1, ..., valuek};

2.将程序划分成类

将数据结构存储本身以及使用结构的部分划分为类,使得程序结构清晰,容易修改和维护.

3.类接口

由于一些方法经常被使用,所以将该类中的方法设计得通用以便其他不同类的调用该类中方法(一般该类中的字段是私有的).面向对象编程的优点之一是类的接口尽可能的设计方便高效.

4.有序数组的java代码

public class TestArray {

static long[] a = { 1, 3, 5, 7, 9 };

static int nElems = a.length;

public static int find(long searchKey) {

int lowerBound = 0;

int upperBound = nElems - 1;

int curIn;

while (true) {

curIn = (lowerBound + upperBound) / 2;

if (a[curIn] == searchKey) {

return curIn;

} else if (lowerBound > upperBound) {

return nElems;

} else {

if (a[curIn] < searchKey) {

lowerBound = curIn + 1;

} else {

upperBound = curIn - 1;

}

}

}

}

public static void main(String[] args) {

int find = find(3);

System.out.println(find);

}

}

1)声明并创建一个long类型的数组

2)声明上限upperBound是最后一个数组下标,下限lowerBound 0,nElems 为最大的数组长.

3)a[curIn]为搜索的数组,则返回下标;如果下限大于上限,则找不到搜索对象;如果a[curIn]小于搜索对象,lowerBound 移动到curIn后面的一个单元,则取a[curIn]右边的中位数,如果a[curIn]大于搜索对象,upperBound 移动到curIn前面的一个单元,则取a[curIn]左边的中位数.

4)效果图

 

6)有序数组的优点

查找比无序数组快的多;

插入慢,所有靠后的数组都要移动为插入元素腾开空间;

有序数组和无序数组的删除慢,所有数据都需要向前移动以填补删除数据的洞.

5.存储对象

数据结构中只是存储一些简单的变量,而我们通常储存的数据是多个字段的结合,所以使用对象来存储.

6.O表示方法

当数据项的数目变化的时候,不同的算法的速度体现不一样.比如,A算法和B算法在数据项是m的时候是相同的,但是数据项是2m的时候BA2,3m的时候,A8.

1)无序数组的插入

时间和数据项的个数无关.因为新的数据项总是被放在下一个有空的地方,所以一次的插入用时总是相同的.

T=k

2)线性查找

线性查找特定的数据所需要比较的次数平均为数据项总数的一半.所以线性查找时间与数组的大小成正比.

T=k*N

3)二分查找

T=k*log(N)

4)大O表示效果图

 

7.为什么不用数组表示一切

无序数组的插入快,但是查找慢,有序数组的查找快,但是插入慢.数组的删除由于半数的数据项为了添补”漏洞”而移动,所以删除平均需要O(N)时间.数组的另外一个问题是一旦new创建之后,大小便被固定住了.容易发生溢出甚至崩溃.

猜你喜欢

转载自blog.csdn.net/weixin_37590206/article/details/80762865