数据结构与算法
文章平均质量分 77
junbin1011
天天向上
展开
-
线性存储结构-ArrayList、Vector
ArrayList:采用数组的内部构建形式,也就是顺序存储模式。当新增一个对象时,如果当前长度超过预设,会使用System.arraycopy(定义一个更长的数组进行复制处理),这个时候开销比较大。System.arraycopy,数组长度小于32的采用的是java层的遍历处理,长数组采用的是native层的处理 /** * The byte array length thresh原创 2016-11-14 16:41:05 · 1093 阅读 · 0 评论 -
排序算法-快速排序
快速排序(Quick Sort)通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小, 则可分别对这部分记录继续进行排序,以达到整个序列有序的目的最好情况o(logn)最坏情况o(n²)排序稳定,但需要额外的辅助空间 static void quickSort(int[] array, int low, int high) {原创 2016-12-24 11:26:43 · 2267 阅读 · 0 评论 -
排序算法-归并排序
归并排序(Merging Sort)利用归并的思想实现的排序方法。它的原理是假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列长度为1,然后两两归并,得到[n/2]个长度为2或1的有序子序列然后反复进行两两归并,直到得到一个长度为n的有序序列为止。 时间复杂度 最好情况o(nlogn) 最坏情况o(nlogn) 排序稳定,但需要额外的原创 2016-12-16 17:36:05 · 2256 阅读 · 0 评论 -
查找算法-稠密索引、分块索引、倒排索引
1.稠密索引稠密索引时指在线性索引中,将数据集中的每个记录都对应一个索引项 。对于索引项一定是按照关键码有序的排列 索引项有序意味着可以使用顺序查找算法,这是稠密索引的有点, 但是如果数据集非常大,意味着索引也得有同样的数据集长度规模。public class Index { public int key; public Object value; public原创 2016-12-10 10:28:43 · 3441 阅读 · 0 评论 -
查找算法-顺序查找、有序查找
1.顺序表的查找1)顺序查找顺序查找又称为线性查找,是一种最简单的查找方法。 从表的一端开始,向另一端逐个按要查找的值key 与关键码key进行比较,若找到,查找成功,并给出数据元素在表中的位置;若整个表检测完,仍未找到与关键码相同的key值,则查找失败,给出失败信息。说白了就是,从头到尾,一个一个地比,找着相同的就成功,找不到就失败。很明显的缺点就是原创 2016-12-06 16:15:44 · 9464 阅读 · 0 评论 -
排序算法-希尔排序
希尔排序(Shell Sort)升级版的插入排序,先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插人排序;然后,取第二个增量d2 时间复杂度: 1)最好情况o(n) 2)最坏情况o(n^3/2)性能高于插入排序 但不稳定。算法稳定性:通俗地讲就是能保证排序前2原创 2016-12-12 17:43:59 · 2136 阅读 · 0 评论 -
排序算法-插入排序
插入排序(Insert Sort)直接插入排序的基本操作是将一个记录插入到已经排好的有序表中,从而得到一个新的、记录数增1的有序表,类似打扑克牌排列表。时间复杂度: 1)最好情况o(n) 2)最坏情况o(n²/4) 插入排序比选择排序及冒泡排序性能好些 static void insertSort(int[] array) { if原创 2016-12-12 17:42:03 · 1986 阅读 · 0 评论 -
排序算法-选择排序
简单选择排序(Simple Selection Sort)就是通过n-i次关键字的比较,从n-i+1个记录中选出关键字最小的记录,并和第i(1 时间复杂度: 1) 最好情况:本身有序,需要比较n-1次 时间复杂度为o(n) 2)最坏情况:逆序情况,需要比较(n-1)+(n-2)+...+2+1=n(n-1)/2 时间复杂度为o(n²)性能上略优于冒泡排序 减少了交换原创 2016-12-12 17:36:58 · 1936 阅读 · 0 评论 -
排序算法-冒泡排序
冒泡排序(Bubble BubbleSort)是一种交换排序,他的基本思路是: 两两比较相邻记录的关键字,如果反序则交换。时间复杂度: 1)最好情况:本身有序,需要比较n-1次 时间复杂度为o(n) 2)最坏情况:逆序情况,需要比较(n-1)+(n-2)+...+2+1=n(n-1)/2 时间复杂度为o(n²)每一轮的排序对下一轮的排序有帮助,数字如同气泡慢慢往原创 2016-12-12 17:26:29 · 1939 阅读 · 0 评论 -
排序算法-堆排序
堆排序(Heap Sort)堆是具有下列性质的完全二叉树:每个节点的值都大于或等于其左右孩子节点的值,称为大顶堆,或者每个节点的值都小于或等于其左右孩子节点的值,称为小顶堆。堆排序的基本思想是,将待排序的序列构成一个大顶堆。此时整个序列的最大值就是堆顶的根节点。将它移走(其实就是将其余堆数组的末尾就是最大值),然后将剩余的n-1个序列重新构造成一个堆,这样就会得到n个元素的次小值,如此反复原创 2016-12-14 23:25:17 · 2195 阅读 · 0 评论 -
顺序存储与链式存储的集合-HashMap、HashTable
HashMap,日常最常用的数据结构之一。它是基于哈希表的 Map 接口的实现,以key-value的形式存在。在HashMap中,key-value总是会当做一个整体来处理,系统会根据hash算法来来计算key-value的存储位置,我们总是可以通过key快速地存、取value。下面将通过源码分析存储结构、初始化、插入、查询、移除等来深入分析Hashmap的实现原理。原创 2016-11-24 18:27:59 · 3985 阅读 · 1 评论 -
红黑树-TreeMap
1.原理排序二叉树排序二叉树是一种特殊结构的二叉树,可以非常方便地对树中所有节点进行排序和检索。排序二叉树要么是一棵空二叉树,要么是具有下列性质的二叉树:若它的左子树不空,则左子树上所有节点的值均小于它的根节点的值;若它的右子树不空,则右子树上所有节点的值均大于它的根节点的值;它的左、右子树也分别为排序二叉树。原创 2016-11-30 16:47:53 · 1209 阅读 · 2 评论 -
线性存储结构-LinkedList
LinkedList内部采用链表的形式构建,是一个双向链表。除了继承List外,还继承了Deque接口,可以当做堆栈结构使用。 private static final class Link { ET data; //数据 Link previous, next; //前节点、后节点 Link(ET o, Link p, Link n) { data = o; prev原创 2016-11-14 16:46:55 · 2005 阅读 · 0 评论 -
线性存储结构-Stack
Stack继承于Vector,是一个模拟堆栈结构的集合类。当然也属于顺序存储结构。这里注意Android在com.android.layoutlib.bridge.impl包中也有一个Stack的实现,继承于ArrayList。构造方法 : public Stack() 创建一个空 Stack。方法: 1. public push (item ) 把项 压入栈顶。其作用与 a原创 2016-11-14 16:43:38 · 936 阅读 · 0 评论 -
排序算法总结
1.排序算法分类基础的排序算法包含冒泡排序、选择排序、插入排序、希尔排序、堆排序、归并排序及快速排序。根据实现类型可分为插入排序类、选择排序类、交换排序类及归并排序类。2.排序算法的综合分析各算法的排序方式、平均情况、最好最坏情况、所需的辅助空间及稳定性如下:事实上,排序算法没有十全十美,本来想写一套模拟测试的数据来验证孰优孰略。但是突然发现可比性不高,需要根据原创 2016-12-24 15:19:16 · 2419 阅读 · 0 评论