
数据结构与算法
with_dream
这个作者很懒,什么都没留下…
展开
-
算法--归并排序
1、基本概念归并排序是将n个记录看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,最终合成一个有序序列。 将数组对半拆分,一直拆分到只有一个元素。然后做归并操作。 归并操作: 创建一个临时数组,然后将两个元素较小值先放入临时数组,再放次小者,将临时数组的内容赋给原数组。循环整个数组 再次创建临时数组,将数组四个四个进行操作,先放最小者,再放次小者。循环整个数组。直到进行整个数组原创 2017-08-07 16:03:47 · 159 阅读 · 0 评论 -
数据结构--平衡二叉树
1、基本概念平衡二叉树(AVL树)是一种二叉排序树,其中每个节点的左子树和右子树的高度最多相差1 平衡因子:二叉树的左子树深度减去右子树的深度 只有-1,0,1三个值 最小不平衡子树:距离插入节点最近,且平衡因子的绝对值大于1的节点为根节点2、实现在构建二叉排序树的过程中,每当插入一个节点,先检查是否因插入的新数据破坏了平衡性 若是 找出最小不平衡子树。在保持排序二叉树特性的情况下,调整最小不平原创 2017-08-04 16:47:04 · 313 阅读 · 1 评论 -
数据结构--串
1、基本概念串是由零个或多个字符组成的有限序列,又名字符串。 1.1 串大小的比较 给定两个串 s=”a0a_0a1a_1…ana_n” t=”b0b_0b1b_1…bmb_m” 当满足以下条件之一,s<t (1)n<m 且 aia_i=bib_i (i=0,1…n) 如s=”hap” ,t=”happy” (2)存在某个值k<=min(m,n) 使得 aia_i=bib_i (原创 2017-07-27 16:15:03 · 443 阅读 · 0 评论 -
数据结构--散列
1、基本概念1.1 散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置 f(key) 其中f称为散列函数或哈希函数1.2 采用散列技术将记录存储在一块连续的存储空间,这块连续的存储空间称为散列表或哈希表1.3 散列技术最适合的技术是查找与给定值相等的记录1.4 冲突:如果两个关键字key1≠\neqkey2,但是却有 f(key1)=f(key原创 2017-08-04 18:33:49 · 525 阅读 · 0 评论 -
数据结构--树
1、基本概念1.1 节点的度:节点拥有的子树数量称为节点的度。度为0的节点称为叶节点。不为0称为分支节点 1.2 树的深度:树中节点的最大层次称为树的深度 1.3 有序树:如果树中节点的各个子树从左至右是有次序的且不能互换的,称为有序树,否则为无序树 1.4 森林:m(m>=0)颗互不相交的树的集合2、二叉树2.1 特点: 每个节点最多有两颗子树。 左右子树有顺序,不能颠倒2.2 特殊的二原创 2017-07-27 20:30:31 · 191 阅读 · 0 评论 -
算法--选择排序
1、基本概念选择排序是比较一圈,找到最小记录,放入数组的开始位置 [3,2,1] 比较一圈 找到最小下标2 将下标2的值与下标0的值交换 循环2、代码public static void main(String[] args) { int[] src = { 3,2,1,4,5,6,7,16,15,14,13,12,11,10,8,9 }; selectSort(src);原创 2017-08-04 19:36:49 · 185 阅读 · 0 评论 -
算法--冒泡排序
1、基本算法public static void main(String[] args) { int[] src = { 3,2,1,4,5,6,7,16,15,14,13,12,11,10,8,9 };// bubbleSort1(src);// print(src);// bubbleSort2(src);// print(src); bubbleSor原创 2017-08-04 19:14:27 · 164 阅读 · 0 评论 -
算法--直插排序
直插排序就是将一个记录插入到已经排好序的有序列表中。 如arr[3, 2, 1]进行排序。 首先将arr[1]赋给变量tmp,再用arr[0]与tmp比较。如果arr[0]>tmp,使arr[0]的值右移,空出来的位置放tmp也就是arr[1]public static void main(String[] args) { int[] src = { 3,2,1,4,5,6,7,16,1原创 2017-08-05 03:58:32 · 879 阅读 · 0 评论 -
算法--希尔排序
1、基本概念希尔排序是基于直插排序,也称为缩小增量排序。 把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。2、实现public static void main(String[] args) { int[] src = { 3,2,1,4,5,6,7,16,15,14,13,12,11原创 2017-08-05 14:05:45 · 198 阅读 · 0 评论 -
数据结构--栈和队列
1、栈栈是一种后进先出的数据结构,简称LIFO 允许插入和删除的一段称为栈顶,另一端为栈底,不含任何元素的栈称为空栈。 栈的基本操作:插入称为入栈、删除叫做出栈。 1.1 线性栈的基本操作public class Stack { private int maxLen = 0; //栈的最大长度 private int index = -1; //栈顶 private i原创 2017-07-26 18:59:54 · 199 阅读 · 0 评论 -
数据结构--表
1、基本概念形如A0A_0,A1A_1,A2A_2…AN-1成为一般表,如果表的大小为0成为空表 对于空表以外的任何表,Ai-1为Ai的前驱,Ai+1为Ai的后驱,A0A_0没有前驱,AN-1没有后驱 线性表分为顺序表和链表2、顺序表顺序表的物理内存是连续的。在存、读取数据时,不管是在哪个位置,时间复杂度都是O(1)。而在插入或者删除时,时间复杂度都是O(n)。比较适合存取数据,不适合经常插入和原创 2017-07-25 20:11:01 · 245 阅读 · 0 评论 -
数据结构--二叉排序树
1、基本概念二叉排序树又称二叉查找树,它是一颗空树或者具有以下特征的二叉树: 若左子树不为空,则左子树上所有节点的值都小于根结构的值 若右子树不为空,则右子树上所有节点的值都大于根结构的值 它的左右子树也分别是二叉排序树2、具体操作static class Node{ int data; Node left, right; public Node(int data){原创 2017-08-03 19:29:05 · 289 阅读 · 0 评论 -
算法--快速排序
1、基本概念快速排序是冒泡的改进版,也是整体性能最好的内排序之一。 快速排序是找一个基准数据key,从数组两边与key比较。如果大于key,则移到右边,如果小于,则移到左边。再对左右两边分别找key,再比较。 2、实现public static void main(String[] args) { int[] src = { 3,2,1,4,5,6,7,16,15,14,13,12,11原创 2017-08-07 17:16:17 · 170 阅读 · 0 评论 -
算法--桶排序与基数排序
1、实现 public static void main(String[] args) { int[] src = { 5,6,7,16,15,14,13,12,11,10,8,9,9 }; radixSort(src, 10, 2); print(src); // bucketSort(src, 3, 20); // p原创 2017-08-08 11:53:25 · 186 阅读 · 0 评论 -
数据结构--图
1、基本概念图是一种多对多的关系的数据结构 1.2 图的定义 1.2.1 无向边 若顶点viv_i到vjv_j之间的边没有方向,这条边称为无向边。如果任意两个顶点之间的边都是无向边,则该图称为无向图。 G=(V, {E}) V={A, B, C} E={(A,B), (B,C), (C,A)}1.2.2 有向边 若顶点viv_i到vjv_j之间的边有方向,这条边称为有向边,也成为原创 2017-07-29 18:20:10 · 644 阅读 · 0 评论 -
数据结构--线索二叉树
1、基本概念普通的二叉树如果有n个节点,则有2n个指针域,有n-1条分支。那么有2n-(n-1)个指针域是空的。 如果想知道某个节点的前驱和后继,需要每次进行中序遍历,经常需要节点的前驱后继的话,效率不高。 可以使用空闲的指针域,分别指向节点的前驱和后继以提高效率。 如D的前驱是H,后继是I2、实现static class Node{ int data; b原创 2017-08-08 17:34:23 · 290 阅读 · 0 评论 -
数据结构--顺序表查找
1、常规的方法int src[] = {0, 1, 2, 3, 4}; public int search(int key){ for (int i = 0; i < src.length; i++) if (src[i] == key) return i;}2、优化1方法中,for循环会每次判断数组是否会越界,可以对这个方面进行优化。int src原创 2017-08-01 19:21:37 · 483 阅读 · 0 评论 -
数据结构--红黑树
1、基本概念红黑树是二叉查找树的一种,与平衡查找树类似,但红黑树的平衡性不像平衡树那样严格。红黑树的特点:任何一个节点都有颜色,黑色或者红色根节点是黑色的父子节点之间不能出现两个连续的红节点任何一个节点向下遍历到其子孙的叶子节点,所经过的黑节点个数必须相等空节点被认为是黑色的红黑树的基本操作插入、删除、遍历。内容操作和平衡树一样,左右旋转。 public class Test {原创 2017-08-09 19:42:34 · 220 阅读 · 0 评论 -
数据结构--有序表查找
对于已经排好序的表,有1、折半查找在有序表中,取中间的记录进行比较,如果相同,匹配成功。如果比中间值小,就在中间记录的左半区进行查找,如果大,就在右半区。public static int binarySearch(int key){ int height = src.length-1; int low = 0; int mid = 0; while(low <= he原创 2017-08-02 19:49:33 · 517 阅读 · 0 评论 -
算法复杂度分析
1、算法复杂度的衡量内存(Memory)时间(Time)指令的数量(Number of Steps)特定操作的数量 磁盘访问数量网络包数量渐进复杂度(Asymptotic Complexity)2、算法的时间复杂度算法的时间复杂度一般分析的都是渐进复杂度,即输入的数据规模趋于无穷大算法分析的种类最坏情况(Worst Case):任意输入规模的最大运行时间。(Usually)平均情原创 2017-07-25 17:19:30 · 261 阅读 · 0 评论 -
算法--堆排序
1、基本概念堆是二叉树的一种,堆中每个节点都大于其左右子节点称为大顶堆,如果每个节点都小于其左右节点的值则为小顶堆。使用完全二叉树实现的堆有如下性质 1.2 思路 将待排序的序列构造成大顶堆,此时最大值就是堆的根元素。将它与末尾元素交换,然后将剩余的n-1个元素重新构造成大顶堆,然后再与n-1个元素交换。 2、实现:public static void main(String[] ar原创 2017-08-06 23:57:55 · 210 阅读 · 0 评论