-------------------------------------------------------------------简介-----------------------------------------------------------------------------
1.数据结构是指数据在计算机内存空间或磁盘中的组织形式
2.正确选择数据结构会使程序的效率大大提高
3.数据结构的例子有数组,栈和链表
4.算法算是完成特定任务的过程
5.在Java中,算法经常通过类的方法实现
6.数据库是指由许多类似记录组成的数据存储的集合
-------------------------------------------------------------------数组-----------------------------------------------------------------------------
1.创建数组
Java中有两种数据类型:基本类型(如int 和 double) 和对象类型。在许多编程语言中(甚至是有些面向对象语言,如c++),数组也是基本类型,但在Java中把他们当作对象来对待
方式一:
int[ ] intArray;
intArray = new int[100];
方式二:
int[ ] intArray = new int[100];
方法三:
int intArray[ ] = new int[100];
2.数组的特性:
2.1, 数组一旦创建,大小不可改变
2.2数组访问是通过下标来访问,且下标从0开始
例:temp = intArray[5];
intArray[4] = 88;
如果访问小于0或比数组大小大的数据项,程序会出现 Array Index Out of Bounds(数组下标越界)的运行时异常
2.3初始化
当创建数组后,如果不另行指定,则数组会自动初始化为空,当访问一个空的数组是,程序会出现Null Pointer Assignment(空指针赋值)的运行时错误
例:int[ ] intArray = { 0,5,4,6,1,5,8 };
int[5] = 8;
2.4 lowArray类和lowArrayAPP类
lowArray.Java中实际上是将一个普通的Java数组封装进lowArray类中,类中的数组隐藏了起来,他是私有的,所以只有lowArray类中的方法才可以访问他,lowArray中有三个方法,setElem()和getElem(),分别用来插入和检索一个数据项,另外一个是构造函数,用来创建一个特定大小的空数组。
lowArrayAPP创建一个lowArray类的对象并用他存储和操作数据,可以将lowArray想象成工具,lowArrayAPP是工具的使用者,现在程序被划分为两个各自扮演不同角色的类,这对于编写一个面向对象的程序来说是关键的第一步
用来存储数据对象的类有时被称为容器类(container class),例如在lowArray.java中lowArray类。通常容器类不仅存储数据,并且提供访问数据的方法和其他诸如排序等复杂的操作
2.5 线性查找
在缺省情况下是线性查找。当查找到的数据比当前数据大的时候,终止查询
二分查找
当使用二分查找时就体现有序数组的好处,这种查找比线性查找快很多,尤其对大数组来说更为显著
有序数组
优点:比无序数组快多了,不好的方面是在插入操作中所有靠后的数据都需要移动以腾开空间,所以速度较慢,有序数组和无序数组中的删除操作都很慢,这是因为数据项必须向前移动来填补已删除数据项的洞。有序数组在查找频繁的情况下十分有用,但插入和删除较为频繁时,无法高效的工作。
2.6 对数
指数函数的反函数 即a =log b N
b a =N
2.7存储对象
2.8大O表示法
在计算机科学中,这种粗劣的度量方法叫做大O表示法
无序数组的插入:常数
是目前唯一一个与数组中的数据项个体无关的算法,新数据项总被放在下一个有空的地方,所以每次插入的时间相同,我们可以说像无序数组插入一个数据项的时间T是一个常数K
线性查找:与n成正比
在数组数据项的查找中,发现寻找特定数据项所需比较次数为数据项总数的一半,因此设n为数据项总数,搜索时间T与n的一半成正比:
T=K*N/2
二分查找:与log(N)成正比
不要常数
2.9为什么不用数组表示一切
数组的缺点:在一个无序数组中可以很快的插入,但是查找却要花费较慢的时间
在一个有序的数组中可以查找的很快,但插入却花费时间
数组被new创建后,大小尺寸是固定的,但通常在开始设计程序时并不知道会有多少数据将会放入数组中,所以需要猜他的大小,如果猜的过大,会使数组中的某些单元永远不会被填充二浪费空间,如果猜的过小,会发生数组的溢出,最好的情况是会像用户发送警告,最坏的情况则会导致程序崩溃
小结:Java中的数组是对象,由new操作符创建
无序数组可以提供快速的插入,但查找和删除很慢
将数组封装到类中可以保护数组不被随意更改
类的接口由类用户可访问的方法(有时还有字段组成)
类的接口被设计成使类用户的操作更加简单
有序数组可以使用二分查找
以b为底a的对数(大概)是在结果小于1之前用b除a的次数
线性查找需要的时间与数组中数据项的个数成正比
大O表示法为比较算法的速度提供了一种方便的方法
O(1)级时间的算法是最好的,O(logN)次之,O(N)一般,O(N2)最差
-------------------------------------------------------------------简单排序---------------------------------------------------------------------------
3.1冒泡排序
int[] num = { 1,4,7,5,6};
for(int i = 0;i<num.length;i++){
for(int j = 0 ;j<num.length-i;J++){
if(num[i] > num[j]){
int sum = num[i];
num[i] = num[j];
num[j] = sum;
}
}
}
3.2选择排序
选择排序改进了冒泡排序,将必要的交换次数从O(N2)减少到O(N)。不幸的是比较次数仍保持在O(N2).然而,选择排序仍然为大记录量的排序提出了一个非常重要的改进,
例:
3.3插入排序:
在大多数情况下,插入算法是基本的排序算法里最好的一种,虽然插入排序算法仍然需要O(N2)的时间,但是一般情况下,它要比冒泡排序快一倍,比选择排序还要快一点。