没有合适的资源?快使用搜索试试~ 我知道了~
数据结构和算法
资源推荐
资源详情
资源评论
Java 数据结构和算法
一、数组于简单排序 ........................................................... 1
二、栈与队列 ................................................................ 4
三、链表 .................................................................... 7
四、递归 ................................................................... 22
五、哈希表 ................................................................. 25
六、高级排序 ............................................................... 25
七、二叉树 ................................................................. 25
八、红—黑树 ............................................................... 26
九、堆 ..................................................................... 36
十、带权图 ................................................................. 39
一、数组于简单排序
数组
数组(array)是相同类型变量的集合,可以使用共同的名字引用它。数组可
被定义为任何类型,可以是一维或多维。数组中的一个特别要素是通过下标来访
问它。数组提供了一种将有联系的信息分组的便利方法。
一维数组
一维数组(one‐dimensionalarray )实质上是相同类型变量列表。要创建一
个数组,你必须首先定义数组变量所需的类型。通用的一维数组的声明格式是:
typevar‐name[];
获得一个数组需要 2 步。第一步,你必须定义变量所需的类型。第二步,你
必须使用运算符 new 来为数组所要存储的数据分配内存,并把它们分配给数组
变量。这样 Java 中的数组被动态地分配。如果动态分配的概念对你陌生,别担
心,它将在本书的后面详细讨论。
数组的初始化(arrayinitializer )就是包括在花括号之内用逗号分开的表达
式的列表。逗号分开了数组元素的值。Java 会自动地分配一个足够大的空间来
保存你指定的初始化元素的个数,而不必使用运算符 new。
Java 严格地检查以保证你不会意外地去存储或引用在数组范围以外的值。
Java 的运行系统会检查以确保所有的数组下标都在正确的范围以内(在这方面,
Java 与 C/C++ 从根本上不同,C/C++ 不提供运行边界检查)。
多维数组
在 Java 中,多维数组(multidimensionalarrays )实际上是数组的数组。你
可能期望,这些数组形式上和行动上和一般的多维数组一样。然而,你将看到,
有一些微妙的差别。定义多维数组变量要将每个维数放在它们各自的方括号中。
例如,下面语句定义了一个名为 twoD 的二维数组变量。
inttwoD[][]=newint[4][5];
简单排序
简单排序中包括了:冒泡排序、选择排序、插入排序;
1.冒泡排序的思想:
假设有 N 个数据需要排序,则从第 0 个数开始,依次比较第 0 和第 1 个数据,
如果第 0 个大于第 1 个则两者交换,否则什么动作都不做,继续比较第 1 个第 2
个…,这样依次类推,直至所有数据都“冒泡”到数据顶上。
冒泡排序的的 java 代码:
PublicvoidbubbleSort()
{
intin,out;
for(out=nElems‐1;out>0;out‐‐)
for(in=0;in<out;in++)
{
If(a[in]>a[in+1])
Swap(in,in+1);
}
}
算法的不变性:许多算法中,有些条件在算法执行过程中始终是不变的。这些
条件被称 为算法的不变性,如果不变性不为真了,则标记出错了;
冒泡排序的效率 O(N*N),比较 N*N/2,交换 N*N/4;
2. 选择排序的思想:
假设有 N 条数据,则暂且标记第 0 个数据为 MIN(最小),使用 OUT 标记最左
边未排序的数据,然后使用 IN 标记第 1 个数据,依次与 MIN 进行比较,如果比
MIN 小,则将该数据标记为 MIN,当第一轮比较完后,最终的 MIN 与 OUT 标记
数据交换,依次类推;
选择排序的 java 代码:
PublicvoidselectSort()
{
Intin,out,min;
For(out=0;out<nElems‐1;out++)
{
Min=out;
For(in=out+1;in<nElems;in++)
If(a[in]<a[min])
Min=in;
Swap(out,min);
}
}
选择排序的效率:O(N*N),比较 N*N/2,交换<N; 选择排序与冒泡排序比
较,比较次数没有明显改变,但交换次数明显减少了很多;
3. 插入排序的思想:
插入排序是在部分数据有序的情况下,使用 OUT 标记第一个无序的数据,将
其提取保存到一个中间变量 temp 中去,使用 IN 标记空位置,依次比较 temp 中
的值与 IN‐1 的值,如果 IN‐值大于 temp 的值,则后移,直到遇到第一个比 temp
小的值,在其下一个位置插入;
插入排序的 java 代码:
PublicvoidInsertionSort()
{
Intin,out;
For(out=1;out<nElems;out++)
{
Longtemp=a[out]
In=out;
While(in>0&&a[in‐1]>temp)
{
A[in]=a[in‐1];
‐‐in;
}
A[in]=temp;
}
}
插入排序的效率:O(N*N), 比较 N*N/4,复制 N*N/4;插入排序在随机数的
情况下,比冒泡快一倍,比选择稍快;在基本有序的数组中,插入排序几乎只需
要 O(N);在逆序情况下,并不比冒泡快;
二、栈与队列
1、栈的定义
栈(Stack)是限制仅在表的一端进行插入和删除运算的线性表。
(1)通常称插入、删除的这一端为栈顶(Top),另一端称为栈底(Bottom)。
(2)当表中没有元素时称为空栈。
(3)栈为后进先出(Last In First Out)的线性表,简称为 LIFO 表。
栈的修改是按后进先出的原则进行。每次删除(退栈)的总是当前栈中"
最新"的元素,即最后插入(进栈)的元素,而最先插入的是被放在栈的底部,
要到最后才能删除。
【示例】元素是以 a1,a2,…,an 的顺序进栈,退栈的次序却是 an,an-1,…,
a1。
2、栈的基本运算
(1)InitStack(S)
构造一个空栈 S。
(2)StackEmpty(S)
判栈空。若 S 为空栈,则返回 TRUE,否则返回 FALSE。
(3)StackFull(S)
判栈满。若 S 为满栈,则返回 TRUE,否则返回 FALSE。
注意: 该运算只适用于栈的顺序存储结构。
(4)Push(S,x)
进栈。若栈 S 不满,则将元素 x 插入 S 的栈顶。
(5)Pop(S)
退栈。若栈 S 非空,则将 S 的栈顶元素删去,并返回该元素。
(6)StackTop(S)
取栈顶元素。若栈 S 非空,则返回栈顶元素,但不改变栈的状态。
剩余41页未读,继续阅读
资源评论
oZuoZuoJian1
- 粉丝: 0
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功