Java数据结构和算法笔记(共49页).doc
《Java数据结构和算法笔记(共49页).doc》由会员分享,可在线阅读,更多相关《Java数据结构和算法笔记(共49页).doc(49页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上Java数据结构和算法第0讲 综述参考教材:Java数据结构和算法(第二版),美 Robert lafore1. 数据结构的特性数据结构优点缺点数组插入快;如果知道下标,可以非常快地存取查找慢,删除慢,大小固定有序数组比无序的数组查找快删除和插入慢,大小固定栈提供后进先出方式的存取存取其他项很慢队列提供先进先出方式的存取存取其他项很慢链表插入快,删除快查找慢二叉树查找、插入、删除都快(如果树保持平衡)删除算法复杂红-黑树查找、插入、删除都快;树总是平衡的算法复杂2-3-4树查找、插入、删除都快;树总是平衡的;类似的树对磁盘存储有用算法复杂哈希表如果关键字已知,则存储极
2、快;插入快删除慢,如果不知道关键字则存储很慢,对存储空间使用不充分堆插入、删除快;对大数据项的存取很快对其他数据项存取慢图对现实世界建模有些算法慢且复杂2. 经典算法总结查找算法:线性查找和二分查找排序算法:用表展示第一讲 数组1. Java中数组的基础知识1) 创建数组在Java中把数组当作对象来对待,因此在创建数组时必须使用new操作符:int intArr = new int10;一旦创建数组,数组大小便不可改变。2) 访问数组数据项数组数据项通过方括号中的下标来访问,其中第一个数据项的下标是0: intArr0 = 123;3) 数组的初始化当创建数组之后,除非将特定的值赋给数组的数据
3、项,否则它们一直是特殊的null对象。 int intArr = 1, 2, 3, 4, 5;等效于下面使用new来创建数组并初始化:int intArr = new int5;intArr0 = 1;intArr1 = 2;intArr2 = 3;intArr3 = 4;intArr4 = 5;2. 面向对象编程方式1) 使用自定义的类封装数组MyArray类:public class MyArray private long arr;private int size;/记录数组的有效长度public MyArray() arr = new long10;public MyArray(int
4、 maxSize) arr = new longmaxSize;/向数组中插入数据public void insert(long element) arrsize = element;size+;/显示数组中的数据public void show() for(int i=0; isize; i+) if(i=0) System.out.print( + arri + , ); else if(i=size-1) System.out.println(arri + ); else System.out.print(arri + , );/根据值查找索引(出现该值的第一个位置):线性查找publi
5、c int queryByValue(long element) int i;for(i=0; i= size | index = size | index 0) throw new ArrayIndexOutOfBoundsException(); else /当size=maxSize,删除最后一个数时,不会执行forfor(int i=index; i= size | index 0) throw new ArrayIndexOutOfBoundsException(); else arrindex = value;2) 添加类方法实现数据操作测试MyArray类方法:public vo
6、id testMyArray() throws Exception MyArray myArray = new MyArray();myArray.insert(123);myArray.insert(456);myArray.insert(789);myArray.show();/123, 456, 789System.out.println(myArray.queryByValue(111);/-1System.out.println(myArray.queryByIndex(2);/789myArray.delete(2);myArray.show();/123, 456myArray.
7、update(0, 0);myArray.show();/0, 4563. 有序数组1) 有序数组简介以及其优点有序数组是一种数组元素按一定的顺序排列的数组,从而方便使用二分查找来查找数组中特定的元素。有序数组提高了查询的效率,但并没有提高删除和插入元素的效率。2) 构建有序数组将2.1中自定义的类封装数组MyArray的insert方法改为如下:/向有序数组中插入数据,按大小从前往后排列public void insert(long element) int i;for(i=0; isize; i+) / find where it goesif(elementi; j-) / move b
8、igger ones uparrj = arrj-1;arri = element;size+;得到有序数组的类封装MyOrderedArray类,测试该类中的insert方法: public void testMyOrderedArray() throws Exception MyOrderedArray myOrderedArray = new MyOrderedArray();myOrderedArray.insert(999);myOrderedArray.insert(555);myOrderedArray.insert(777);myOrderedArray.show();/555
9、, 777, 9994. 查找算法1) 线性查找在查找过程中,将要查找的数一个一个地与数组中的数据项比较,直到找到要找的数。在2.1中自定义的类封装数组MyArray的queryByValue方法,使用的就是线性查找。2) 二分查找二分查找(又称折半查找),即不断将有序数组进行对半分割,每次拿中间位置的数和要查找的数进行比较:如果要查找的数中间数,则表明该数在数组的后半段;如果要查的数=中间数,则返回中间数。在有序数组的类封装类MyOrderedArray中添加binarySearch方法 /根据值二分查找索引(前提:有序)public int binarySearch(long value)
10、 int middle = 0;int left = 0;int right = size - 1;while(true) middle = (left + right) / 2;if(arrmiddle = value) return middle;/ found it else if(left right) return -1;/ cant found it else / divide rangeif(arrmiddle value) right = middle - 1;/in lower half else left = middle + 1;/ in upper half测试该二分查
11、找方法: public void testMyOrderedArray() throws Exception MyOrderedArray myOrderedArray = new MyOrderedArray();myOrderedArray.insert(999);myOrderedArray.insert(555);myOrderedArray.insert(777);myOrderedArray.insert(333);System.out.println(myOrderedArray.binarySearch(333);/0第二讲 简单排序本讲提到的排序算法都假定了数组作为数据存储结
12、构,本讲所有算法的时间复杂度都是。在大多数情况下,假设当数据量比较小或基本上有序时,插入排序算法是三种简单排序算法中最好的选择,是应用最多的。对于更大数据量的排序来说,后面讲到的快速排序通常是最快的方法。1. 冒泡排序1) 基本思想在要排序的一组数中,对当前还未排好序的范围内的全部数,自下而上对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。2) 算法实现冒泡排序的Java代码:/ bubble sortpublic static void bubbleSort(long arr) long temp;for
13、(int i=0; ii; j-) /inner loop (backward)if(arrj arrj-1) / swap themtemp = arrj;arrj = arrj-1;arrj-1 = temp;测试冒泡排序及输出结果: public void testBubbleSort() throws Exception long arr = 79, 91, 13, 52, 34;Sort.bubbleSort(arr);System.out.println(Arrays.toString(arr);/13, 34, 52, 79, 912. 选择排序1) 基本思想在要排序的一组数中,
14、选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。与冒泡排序相比,选择排序将必要的交换次数从O(N*N)减少到O(N),但比较次数仍然保持为O(N*N)。2) 算法实现选择排序的Java代码:/ select sortpublic static void selectSort(long arr) long temp;for(int i=0; iarr.length-1; i+) /outer loopint k = i; / location of minimumfor(int j=i+1; jarr.lengt
15、h; j+) /inner loopif(arrj =2个数已经是排好顺序的(局部有序),现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。在插入排序中,一组数据仅仅是局部有序的;而冒泡排序和选择排序,一组数据项在某个时刻是完全有序的。2) 算法实现插入排序的Java代码:/ insert sortpublic static void insertSort(long arr) long temp;for(int i=1; i=1 & arrj-1temp) / until one is smallerarrj = arrj-1; / shift i
16、tem rightj-; / go left one positionarrj = temp; / insert marked item测试插入排序以及输出结果:public void testInsertSort() throws Exception long arr = 79, 91, 13, 52, 34, 34;Sort.insertSort(arr);System.out.println(Arrays.toString(arr); /13, 34, 34, 52, 79, 91第三讲 栈和队列栈和队列都是抽象数据类型(abstract data type,ADT),它们既可以用数组实
17、现,又可以用链表实现。1. 栈1) 栈模型栈(Stack,又LIFO:后进先出)是一种只能在固定的一端进行插入和删除的数据结构。栈只允许访问一个数据项:即最后插入的数据项,移除这个数据项后才能访问倒数第二个插入的数据项,以此类推。栈可以用数组来实现,也可以用链表来实现。2) 栈的数组实现栈的Java代码:public class MyStack private long arr; /底层使用数组实现private int top;public MyStack() arr = new long10;top = -1;public MyStack(int maxSize) arr = new lo
18、ngmaxSize;top = -1;/ put item on top of stackpublic void push(long value) arr+top = value;/ take item from top of stackpublic long pop() return arrtop-;/ peek at top of stack public long peek() return arrtop;/ ture if stack is emptypublic boolean isEmpty() return (top = -1);/ ture if stack is fullpu
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 数据结构 算法 笔记 49
限制150内