数据结构与算法
北半球先生
to be you want to be
展开
-
排序——插入排序
一、插入排序插入排序思想:回想一下我们打扑克的时候摸牌的过程,有时喜欢把牌按大小顺序排列起来,每次摸到的牌和手中的牌比较,如果小的话就往前找位置,一直移到比它小的牌后面,比它大的牌前面,然后将牌插入,一直到牌摸完,我们手中的牌最后就是有序的。而插入排序就像我们打扑克牌摸牌的过程是一样的。来看代码:public void insertSort(int[] arr) { fo...原创 2019-07-05 17:01:30 · 112 阅读 · 0 评论 -
排序——快速排序
快速排序算法思路:快速排序采用双向查找的策略,每一趟选择当前所有子序列中的一个关键字作为分割线,将子序列中比分割线小的前移,比分割线大的后移,当本趟所有子序列都被分割线按上述规则划分完毕后将会得到新的一组更短的子序列,他们将成为下趟划分的初始序列集。下面来看代码: public void quickSort(int a[], int low, int high) { if (low...原创 2019-07-10 15:04:13 · 138 阅读 · 0 评论 -
字符串匹配——KMP算法
算法思路: 假设文本串S匹配到 i 位置,模式串P匹配到 j 位置如果j = -1,或者当前字符匹配成功(即S[i] == P[j]),则令i++,j++,继续匹配下一个字符;如果j != -1,且当前字符匹配失败(即S[i] != P[j]),则令 i 不变,j = next[j]。此举意味着失配时,模式串P相对于文本串S向右移动了j - next [j] 位。next数组的求解:...原创 2019-06-27 13:43:01 · 137 阅读 · 0 评论 -
排序——选择排序
选择排序思想: 选择排序,从第一个元素开始,每次从后面的元素中选择一个最小的依次放入前面的位置。下面来看代码: public void selectSort(int arr[]) { for (int i = 0; i < arr.length; i++) { int minIndex = i; // 找到最小值元素的位置minIndex for (i...原创 2019-07-08 11:14:12 · 103 阅读 · 0 评论 -
排序——归并排序
归并排序算法思想: 归并排序的思路是大问题不断地化简为小问题,即不断地将待排序的序列拆分成更小的序列,直到不可拆分(只有一个元素)为止,然后将各个排好序的序列合并起来,最终得到一个有序的序列,每次拆分将序列拆分为原来的一半,子问题排好序后合并,所以归并排序的时间复杂度为O(n*logn)。下面来看代码: public void mergeSort(int[] arr) { //...原创 2019-07-08 15:05:42 · 121 阅读 · 0 评论 -
哈夫曼树
哈夫曼树: 当树中的节点被赋予一个表示某种意义的数值,我们称之为该节点的权。从树的根节点到任意节点的路径长度(经过的边数)与该节点上权值的乘积称为该节点的带权路径长度。树中所有叶节点的带权路径长度之和称为该树的带权路径长度(WPL)。当带权路径长度最小的二叉树被称为哈夫曼树,也成为最优二叉树。哈夫曼树的构造: 哈夫曼树在构造时每次从备选节点中挑出两个权值最小的节点进行构造,每次构...原创 2019-07-01 15:09:07 · 715 阅读 · 0 评论 -
堆
堆是一种数据结构,分为大根堆和小根堆。下面以大根堆为例1.大根堆有着如下特点: a.顺序:堆顶元素永远是最大的。 b.形状:堆是一颗完全二叉树。这两个特性保证了堆在插入和删除的过程中最大时间复杂度也是满足O(logn)的,所以是一种非常高效的数据结构格式。2.更新堆的两种方式,分别对应了插入元素和删除堆顶元素操作: 自底向上...原创 2019-05-22 15:15:26 · 185 阅读 · 0 评论 -
图解红黑树
————————————二叉查找树(BST)具备什么特性呢?1.左子树上所有结点的值均小于或等于它的根结点的值。2.右子树上所有结点的值均大于或等于它的根结点的值。3.左、右子树也分别为二叉排序树。下图中这棵树,就是一颗典型的二叉查找树:1.查看根节点9:2.由于10 > 9,因此查看右孩子13:...转载 2019-03-11 22:30:15 · 316 阅读 · 0 评论 -
动态规划——0-1背包问题
背包问题:给定n种物品和一个书包。物品I的体积是wi,其价值为vi,背包的容量为c。问应如何选择装入背包的物品,使得装入背包中物品的总价值最大?在装入背包时,每种物品i只有两种选择:装入或者不装入。既不能装入多次,也不能只装入一部分.物品类:public class Goods { // 体积 int volume; // 价值 int values; pu...原创 2018-11-07 11:24:39 · 259 阅读 · 0 评论 -
排序——冒泡排序
普通冒泡排序算法思想: 冒泡排序是每次将最大(正序)或最小(逆序)的元素像我们的泡泡一样“冒”到序列末尾,直到整体有序为止。我们先来看看如下的过程:比如我将 3,2,5,1,4从小到大排序第一趟排序: 3比2大所以2,3交换位置得到 2,3,5,1,4 然后轮到3,5比较,3比5小不做交换 然后轮到5...原创 2018-08-10 17:01:42 · 317 阅读 · 0 评论 -
算法数据结构分类题
http://www.pythontip.com/acm/problemCategory转载 2018-03-22 10:29:06 · 213 阅读 · 1 评论 -
递归回溯——八皇后问题
八皇后问题: 国际象棋中皇后能横向,纵向和斜向移动,在这三条线上的其他棋子都可以被吃掉。所谓八皇后问题就是:将八位皇后放在一张8x8的棋盘上,使得每位皇后都无法吃掉别的皇后,(即任意两个皇后都不在同一条横线,竖线和斜线上),问一共有多少种摆法?解决思路:1.将第一行第一列放入2.在第二行适合的位置(不在上一个皇后的同行同列及对角线上)放入如此类推,直到放到第八个皇后即为一种解...原创 2019-07-01 13:44:31 · 187 阅读 · 0 评论