
算法
MU_kaka
仰天大笑出门去,我辈岂是蓬蒿人
展开
-
剑指offer习题集
1.二维数组中的查找(1)题目在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。(2)代码public boolean Find(int target, int [][] array) { int len = array.length-1; ...原创 2018-08-19 22:50:39 · 242 阅读 · 0 评论 -
查找算法(1)顺序查找
一.基本思想 顺序查找也称为线性查找,属于无序查找算法,从线性表一端开始顺序扫描,并与给定值进行比较,若相等则成功,扫描结束仍没查找到,则查找失败二.复杂度分析 查找成功时平均查找长度:(1+2+3+...n)/n = (n+1)/2 查找不成功时:进行n次比较 顺序查找的平均时间复杂度:O(n)三.实现代码public class Sequence { publi...原创 2018-06-20 09:39:43 · 755 阅读 · 0 评论 -
排序算法(6)归并排序
一.基本思想 归并排序是分治思想的典型应用 归并操作是指将两个已排序列合并成一个序列的过程 (1)申请空间,创建一个大小等于待排数组的新数组 (2)设定两个指针,初始位置分别是两个已排序列的起始位置 (3)比较两个指针指向的元素,选择相对小的元素放到合并空间(新数组) (4)某一指针达到队尾,将另一个序列的全部元素添加至新数组二.概览 分类:归并排序 ...原创 2018-06-19 15:15:15 · 395 阅读 · 0 评论 -
排序算法(5)堆排序
一:基本思想堆排序是利用堆(一种近似完全二叉树的结构)这种数据结构设计的一种排序算法(1)由输入的无序数组构造一个最大堆,作为初始的无序区(2)把堆顶元素(最大值)和堆尾元素进行互换(3)把堆的尺寸缩小1,并调用heapify(A,0)从新的堆顶元素开始进行堆调整(4)重复步骤(2),直到堆的尺寸为1二.概览分类:内部比较排序数据结构:数组最差时间复杂度:O(nlogn)最优时间复杂度:O(nlo...原创 2018-06-19 14:59:13 · 163 阅读 · 0 评论 -
排序算法(5)选择排序
一.基本思想初始时从队列中选出最大(小)的元素放到序列的起始位置,再从剩余的序列中选出最大(小)的元素放在已排序列的末尾,以此类推,直到所有元素均排序完毕二.概览分类:内部选择排序数据结构:数组最差时间复杂度:O(n^2)最优时间复杂度:O(n^2)平均时间复杂度:O(n^2)所需辅助空间:O(1)稳定性:不稳定三.代码实现public class Selection{ public st...原创 2018-06-19 13:52:36 · 140 阅读 · 0 评论 -
排序算法(4)希尔排序
一.基本思想希尔排序,也叫递减增量排序,是插入排序的改进版本插入排序对于几乎已经排好序的序列进行排序时几乎可以达到线性,但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位 所以希尔排序先将序列分为几个增量区域来分别的进行插入排序,最后对整个序列进行排序二.概览分类:比较排序数据结构:数组最差时间复杂度:O(n^2)最优时间复杂度:O(n)平均时间复...原创 2018-06-19 12:49:20 · 235 阅读 · 0 评论 -
排序算法(3)简单插入排序
一.基本思想类似于抓扑克牌,对于未排序的数据,在已排序的数据中从前向后扫描,并插入相应位置二.概览分类:内部比较排序数据结构:数组最坏时间复杂度:最坏情况是输入序列为降序的,此时时间复杂度O(n^2)最优时间复杂度:最好情况输入序列是升序排列,此时时间复杂度O(n)平均时间复杂度:O(n^2)所需辅助空间:O(1)稳定性:稳定三.代码pub...原创 2018-06-19 12:34:37 · 379 阅读 · 0 评论 -
排序算法(2)快速排序
一.基本思想采用分治思想(1)从序列中挑出一个元素作为“基准”(privot)(2)把所有比基准小的元素放在基准前面,把所有比基准大的元素放在基准后面,这个操作称为“分区”(3)对每个分区递归的进行(1),(2),递归结束的条件是序列的大小是0或1二.概览分类:内部比较排序数据结构:数组最差时间复杂度:(每次选取的基准都是最大或最小的元素,导致只划分出一个分区,需要进行n-1次递归)O(n^2)最...原创 2018-06-19 12:18:27 · 154 阅读 · 0 评论 -
排序算法(1)冒泡排序
一. 基本思想冒泡排序的基本思想是,对相邻的元素进行两两比较,如果前一个比后一个大,则交换位置,这样每一趟就会冒出一个最大的二.动图演示三 .代码实现public class Bubble { public static void sort(int[] a){ int N = a.length; for(int i = 0;i<N;i++){ ...原创 2018-06-19 11:10:02 · 239 阅读 · 0 评论 -
算法基础-时间复杂度
1.算法的效率算法的效率主要由以下两个复杂度来评估: 时间复杂度:评估执行程序所需要的时间 (估算程序对处理器的使用程度) 空间复杂度:评估执行程序所需要的存储空间(估算程序对内存的使用程度)2.时间复杂度(1)时间频度 一个算法中语句执行的次数称为语句频度或时间频度,记为T(n) 其中n为问题规模(2)时间复杂度 随着问题规模n的不断变化,算...原创 2018-06-18 20:51:42 · 1357 阅读 · 0 评论 -
排序算法(0)排序算法概览
常见排序算法及其时间复杂度1. 稳定的排序稳定的排序:序列中相同元素的相对位置在排序前后不发生改变稳定的排序有:冒泡排序,插入排序,归并排序,基数排序2.排序的分类(1)内部排序:将要处理的数据加载到内存中进行排序(2)外部排序:数据量过大,无法全部加载到内存,需要借助外部存储...原创 2018-06-18 18:47:09 · 234 阅读 · 0 评论 -
查找算法(6)红黑树(RBT)
前言: 2-3树虽然能实现平衡性,但在插入和删除的过程中需要判断插入的节点是2-节点还是3-节点等一系列问题,实现复杂且会增加额外的开销,所以就提出了红黑树(发明者--Sedgewick,1987年)一.基本概念 1.红黑二叉查找树背后的基本思想是利用标准的二叉查找树(完全由2-结点构成)再通过添加一些额外的信息来表示3-节点从而实现2-3树。 2.红黑树的链接有两种类...原创 2018-06-22 23:31:33 · 595 阅读 · 0 评论 -
查找算法(4)平衡二叉树(AVL)
一 .基本思想 1. AVL树是高度平衡的二叉树,满足左子树树上所有节点的值均小于根节点的值,右子树上所有节点的值均大于根节点的值,它的左右子树也分别为二叉搜索树 2.AVL树性质 (1)左子树和右子树高度之差绝对值不超过1 (2)树中每个左子树和右子树都是AVL树 (3)任何一个节点的平衡因子(BF)是 -1,0-1之一二.AVL树的调...原创 2018-06-23 22:49:06 · 338 阅读 · 0 评论 -
查找算法(5)平衡多路查找树 ——2-3查找树
一.2-3查找树定义 前面的二叉查找树在最坏的情况下性能还是很糟糕的,所以我们需要保持二叉查找树的平衡性,不幸的是,在插入过程中保证树的完美平衡的代价太高了,所以我们稍稍放松完美平衡的要求 2结点:每个结点包含一个元素和两个孩子(或者没有孩子)。其中左孩子小于该节点元素,右孩子大于该节点元素。 3结点:每个节点包含两个元素和三个孩子(或者没有孩子)。其中左孩子小于节点中较小元素...原创 2018-06-22 16:14:39 · 637 阅读 · 0 评论 -
查找算法(3)二叉搜索树(BST)
一.基本思想 二叉搜索树是指左右子树均小于它根结点的值,且没有键值的结点二.复杂度分析 和二分查找一样,插入和查找的时间复杂度均为O(logn),但在最坏的情况下仍然有O(n)的时间复杂度(原因在于在插入和删除元素的时候树没有保持平衡,这也是平衡查找树设计的初衷) 性质:若按中序遍历,可以得到它由小到大的序列三. 代码实现public class BinaryTree { ...原创 2018-06-21 14:29:38 · 267 阅读 · 0 评论 -
查找算法(2)二分查找
一.基本思想 也称为折半查找,属于有序查找算法,先用给定元素与中间的值进行比较,若不相等,再根据大小查找左边或右边的子表,这样递归查找,直到查找到或查找结束二.复杂度分析 最坏情况下,关键词比较次数是log2(n+1),期望时间复杂度为O(log2n) 折半查找的前提是序列有序,对于静态表(一次排序后不再变化)查找 但对于频繁插入删除的数据集,维护排序工作量大,不建议使用...原创 2018-06-20 21:37:46 · 209 阅读 · 0 评论