经典算法
str_818
这个作者很懒,什么都没留下…
展开
-
一步一步写二叉平衡树(AVL树)
转载:http://www.cppblog.com/cxiaojia/archive/2012/08/20/187776.html平衡二叉树(Balanced Binary Tree)是二叉查找树的一个进化体,也是第一个引入平衡概念的二叉树。1962年,G.M. Adelson-Velsky 和 E.M. Landis发明了这棵树,所以它又叫AVL树。平衡二叉树要求对于每一个节点来说,它的左右...转载 2015-12-08 22:24:00 · 279 阅读 · 0 评论 -
【排序】图解桶排序
一、思想桶排序是计数排序的扩展版本,计数排序可以看成每个桶只存储相同元素,而桶排序每个桶存储一定范围的元素,通过映射函数,将待排序数组中的元素映射到各个对应的桶中,对每个桶中的元素进行排序,最后将非空桶中的元素逐个放入原序列中。二、图解过程...原创 2019-02-19 09:32:31 · 73456 阅读 · 31 评论 -
【排序】图解计数排序
一、思想一句话总结:开辟额外空间,统计每个元素的数量。计数排序是一种不基于比较的排序算法,主要思想是计算出待排序序列的最大值 maxValue 与 最小值 minValue,开辟一个长度为 maxValue - minValue + 1 的额外空间,统计待排序序列中每个元素的数量,记录在额外空间中,最后遍历一遍额外空间,按照顺序把每个元素赋值到原始序列中。二、图解过程 三、核心代码...原创 2019-02-18 10:31:24 · 2057 阅读 · 1 评论 -
【排序】图解堆排序
一、思想一句话总结:通过建立最大/小堆 + 下沉元素找到最值。在学习堆排序之前,先了解一下什么是堆。堆是一个数组,可以被看成一个近似的完全二叉树,如下图所示,树上的每一个结点对应数组中的一个元素。除了最底层外,该树是完全充满的,而且是从左到右填充。在不越界的情况下,任何一个节点的左叶子节点在数组中的下标为 2i+1 ,右叶子节点在数组中的下标为 2i+2 ,父节点在数组中的下标为 (i-1)/...原创 2019-02-17 14:15:42 · 663 阅读 · 2 评论 -
【排序】图解希尔排序
一、思想一句话总结:通过粗粒度的插入排序改善数列的有序程序,逐步细化,直到间隔为 1。希尔排序是对直接插入排序的改进算法,在使用直接排序算法时,如果序列很长,且无序程度较高,向前插入一次可能导致移动的操作很大。如果原序列相对有序(小的数大致在前,大的数大致在后),则能缓解这一问题。希尔排序就是在插入排序的之前进行了粗略的排序,使原序列相对有序。二、图解过程间隔 D 有很多中选择,此处使用...原创 2019-02-16 17:24:03 · 2313 阅读 · 1 评论 -
算法复杂度基础
一、什么是算法复杂度?算法进行计算的时候,存储数据需要占用一定的 空间,执行计算需要耗费一定的时间 时间。算法复杂度就是在算法计算过程中对「空间」与「时间」的评价。解决同一个问题,不同算法所有的空间和时间是不同的,这取决于算法是如何设计的。同样,同一个问题,规模不同时,同一个算法所用的空间和时间也不同。例如:某排序算法为 100 个数排序和为 1000 个数排序。所以,一个算法的复杂度是问...原创 2019-02-16 13:50:04 · 356 阅读 · 1 评论 -
【排序】图解快速排序
一、思想与归并排序相同,快速排序也是用分支的思想。首先从数组中随机选取一个元素最为基准数,将该元素交换的数组的最后一位。将所有小于基准数的放置在左边,大于基准数的放置在右边,中间剩下的是等于基准数的元素,这时将基准数交换到中间,形成了一个以基准数为中心左右分治的数组,左面的元素都小于基准数,右边的元素都大于基准数。这时,分别将左右两个大于基准数与小于基准数的序列递归重新执行上述步骤,即可得到最终...原创 2018-11-14 23:30:16 · 973 阅读 · 0 评论 -
【排序】图解插入排序
插入排序一、思想插入排序的工作方式像许多人排序一手扑克牌,开始时,我们的左手为空并且桌子上的牌面朝下。然后,我们每次从桌子上拿走一张牌并将它插入左手中正确的的位置,从右到左将它与已在手中的每张牌进行比较,选择正确位置进行插入,这样,当桌子上的牌全部插入到手中,手中的扑克牌则是所有扑克牌的已排序状态。二、图解过程三、核心代码//插入排序算法public static void inse...原创 2018-11-08 11:23:16 · 1728 阅读 · 0 评论 -
【排序】图解选择排序
一、思想首先,找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么就和自己交换)。在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。这种方法叫做选择排序,因为它在不断地选择剩余元素之中的最小者。二、图解过程三、核心代码//选择排序算法public static void selectionSort(in...原创 2018-11-08 10:14:49 · 498 阅读 · 0 评论 -
【排序】图解归并排序
一、思想归并排序是创建在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。主要的思想为「分而治之」,将大问题化解成一个个的小问题,逐个求解,最后将这些结果组合到一起。二、图解过程三、核心代码//归并排序public static void mergeSort(int[] arr) { if (arr == null || arr.length < 2) {...原创 2018-11-13 17:08:33 · 273 阅读 · 0 评论 -
【排序】图解冒泡排序
冒泡排序一、思想对相邻的元素进行两两比较,顺序相反则进行交换,这样,每一趟都会将最小或最大的元素交换的顶端,最终达到完全有序,例如,升序排列,就是最大的元素移动后面的过程。二、图解过程冒泡排序升序排列的整个过程如下图,数组共包含6个元素,第一轮将6个元素中最大的元素“11”交换至数组的最后;第二轮将剩下5个元素中的最大元素“8”交换至“11”的前面。依次执行,直到所有的元素比较完成。...原创 2018-11-06 12:31:46 · 2624 阅读 · 0 评论 -
最大最小公倍数
算法训练 最大最小公倍数 时间限制:1.0s 内存限制:256.0MB问题描述已知一个正整数N,问从1~N中任选出三个数,他们的最小公倍数最大可以为多少。输入格式输入一个正整数N。输出格式 输出一个整数,表示你找到的最小公倍数。 样例输入 9 样例输出 504 数据规模与约定1 <= N <= 106。这道题,首先说明一下,公认的5,8,9,10四个测试数据有错误,详情看论坛。。。还有,转载 2016-03-15 19:22:41 · 261 阅读 · 0 评论 -
Dijkstra算法
Dijkstra算法解决的是带权重的有向图上单源最短路径问题,该算法要求所有的边的权重都为非负值。具体思路如下:1. S={V1} ; D{j}=cost[1,j] j=2,3,……n 2. D[k]=min{D[j]} ; S=S∪{Vk} 3. D[j]=min{D[j],D[k]+cost[k,j]} 4. if S=V,end; else goto step原创 2015-11-23 20:01:17 · 195 阅读 · 0 评论 -
【排序】图解基数排序
一、思想基数排序可以看成是桶排序的扩展,以整数排序为例,主要思想是将整数按位数划分,准备 10 个桶,代表 0 - 9,根据整数个位数字的数值将元素放入对应的桶中,之后按照输入赋值到原序列中,依次对十位、百位等进行同样的操作,最终就完成了排序的操作。二、图解过程 三、核心代码// 基数排序public static void radixSort(int[] arr) { if (...原创 2019-02-19 11:47:56 · 5497 阅读 · 0 评论