算法
公众号:网瘾少年之路
公众号:网瘾少年之路
展开
-
Javascript实现的排序算法样例
最近需要写一个排序算法,很久没写发现有些生疏了,抽时间用JavaScript实现了几种常用的排序算法,以备不时之需。一、快速排序 步骤: 1. 在数据集之中,选择一个元素作为”基准”(pivot)。 2. 所有小于”基准”的元素,都移到”基准”的左边;所有大于”基准”的元素,都移到”基准”的右边。 3. 对”基准”左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩原创 2016-12-15 12:56:15 · 420 阅读 · 0 评论 -
基础数据结构04:背包
介绍 背包是一种不支持从中删除元素的集合数据类型。它存在的目的就是帮助收集元素并迭代遍历收集到的元素。迭代的顺序不确定且与用例无关。APIJava实现 背包可以使用数组,也可以使用链表来实现。如果使用数组,需要考虑数组的动态扩容。这里使用链表来实现,避免数组扩容的问题。另外沿用上一篇stack的实现,只需要把push方法修改为add方法即可。虽然使用链表后,元素遍历是有一定顺序的,不过没用影响,原创 2017-07-18 17:06:25 · 1072 阅读 · 0 评论 -
基础数据结构02:队列
介绍 队列是一种先进先出的数据结构。类似于一截水从一端流向另一端的水管,先进入水管的水最先从另一端出来。Java实现 下面使用链表来实现先进先出的数据结构。package com.algs.base;import java.util.Iterator;import java.util.NoSuchElementException;public class LinkQueue<Item> im原创 2017-06-30 23:58:19 · 733 阅读 · 1 评论 -
基础数据结构01:链表
说明 链表的类似于一个连着一个的圆环。在链表中,要想访问某个节点,必须通过他的上一节点来访问。Java实现package com.algs.base;import java.util.Iterator;import java.util.NoSuchElementException;public class Link<Item> implements Iterable<Item> { pr原创 2017-06-26 22:32:38 · 737 阅读 · 0 评论 -
排序算法09:排序算法总结
在这篇之前,对常见的8中排序算法进行了梳理,《算法》第四版中的这一张图对各种排序算法的性能特点做了总结。 补充冒泡排序:稳定、原地排序、时间复杂度为n²,空间复杂度为1。其它:快速排序是最快的通用排序算法。存在大量重复元素情况下,三向快速排序是不错的选择。如果稳定性很重要而空间又不是问题,归并排序是最好的选择。稳定性:如果一个排序算法能够保留数组中重复元素的相对位置则可以被称为是稳定的原创 2017-05-05 09:20:17 · 653 阅读 · 0 评论 -
排序算法08:优先队列与堆排序
堆排序一种是基于二叉堆的排序。本文将从优先队列讲起,循序渐进的实现堆排序。这也是《算法》第四版上讲解堆排序的大致章节结构。另外,本文所有的图都来自于此书。优先队列 普通队列是一种先进先出的数据结构,先放进队列的元素取值时优先被取出来。而优先队列是一种具有最高优先级元素先出的数据结构,比如每次取值都取最大的元素。 优先队列有两个核心方法,一个是insert(val)向队列中添加元素,另外一个是de原创 2017-05-03 23:56:38 · 2458 阅读 · 0 评论 -
排序算法07:三向快速排序
算法介绍 在上一篇排序算法06:快速排序中,可以知道,快速排序不停的递归切分数组。在有大量的重复元素情况下,这样的切分存在巨大的改进空间。三向切分的快速排序就是为了提升在有大量重复元素情况下快速排序的性能。 快速排序把数组切分为两部分,分别对应与小于,大于切分元素的数组元素。而三向切分将数组切分为三部分,分别对应小于,等于,大于切分元素的数组元素。 三向切分的快速排序的算法逻辑为:从左到右遍历原创 2017-04-30 23:21:11 · 1338 阅读 · 1 评论 -
排序算法06:快速排序
算法介绍 快速排序是一种分治的排序算法。排序逻辑为:先挑一个元素来切分数组,最终让该元素的左侧都小于该元素,右侧的所有元素都大于该元素。递归的让左侧和右侧分别执行该操作,最终让整个数组变得有序。快速排序示意图: 咋眼一看快速排序跟归并排序很像,其实区别挺明显的。归并排序将数组分成两个子数组分别排序,并将有序的子数组归并以将整个数组排序;而快速排序将数组排序的方式则是当左右两个数组有序时整个数组为原创 2017-04-30 23:19:06 · 874 阅读 · 0 评论 -
排序算法05:归并排序
算法介绍 归并排序的算法逻辑为把两个有序的数组归并为一个有序的数组。举个例子,对于一个长度为8的数组,有两种归并方式自顶向下的归并: 1. 先分为[0-3],[4-7],左右有序后再归并到一起就变成一个完整的有序数组了 2. 让[0-3]有序又可以分为[0-1]、[2-3]有序,递归下去,最终归并为[0-3]有序自底向上的归并:先让[0-1],[2-3],[4-5],[6-7]有序再让[0原创 2017-04-29 16:59:39 · 947 阅读 · 1 评论 -
排序算法01:冒泡排序
算法介绍 步骤: 1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 2. 对第0个到第n-1个数据做同样的工作。这时,最大的数就“浮”到了数组最后的位置上。 3. 针对所有的元素重复以上的步骤,除了最后一个。 4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。可视化效果:这里Javascript实现/** * Created by原创 2017-04-22 19:43:50 · 620 阅读 · 2 评论 -
排序算法02:选择排序
算法介绍 首先,从[0,len]中找到数组中最小的元素,让它与第一个元素交换。接着从[1,len]中找出最小的元素,让它与第二个元素交换。循环往复,最终使得数组从小到大排序。可视化效果:这里Javascript实现/** * Created by YiYing on 2017/4/22. */(function (W) { function Selection(arr) {原创 2017-04-22 19:44:41 · 441 阅读 · 2 评论 -
排序算法03:插入排序
算法介绍 步骤: 1. 从第一个元素开始,该元素可以认为已经被排序 2. 取出下一个元素,在已经排序的元素序列中从后向前扫描 3. 如果被扫描的元素(已排序)大于新元素,将该元素后移一位 4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置 5. 将新元素插入到该位置后 6. 重复步骤2~5排序演示: 可视化效果:这里Javascript实现/原创 2017-04-23 00:01:04 · 576 阅读 · 2 评论 -
排序算法04:希尔排序
算法介绍 从上一篇《插入排序》可以知道,当最小元素恰好在最后一个时,需要移动的次数为N-1。当一个从大到小排列的数组使用插入排序变成从小到大排列时,需要比乱序状态下耗费更多的时间。原因为插入排序是从后往前一位一位的往前交换,如果能把靠后的较小元素只交换(移动)一次就插入到靠前位置,则能有效的缩短排序时间。希尔排序就是这样一种算法。 希尔排序通过一个序列让靠后的元素一次性移动到前面,最后使用插入排原创 2017-04-23 22:57:13 · 914 阅读 · 2 评论 -
JavaScript数组倒序算法与性能对比
最近正在撸算法第四版,关于JS中数组的倒序,想到如下几种实现方式。for push(function (arr) { var result = [],len=arr.length-1; for(var right=len;right>=0;right--){ result.push(arr[right]) } console.log(result.jo原创 2017-03-14 13:00:37 · 1922 阅读 · 0 评论 -
算法的时间复杂度
关于算法的时间复杂度经常会看到比如logN,NlogN等。之前一直觉得搞不清楚,来一个问题不知道怎么得出该算法的时间复杂度。最近在撸《算法》第四版,是时候祭出下面这张图了。 时间复杂度这个东西,其实更准确点说应该是描述一个算法在问题规模不断增大时对应的时间增长曲线。所以,这些增长数量级并不是一个准确的性能评价,可以理解为一个近似值,时间的增长近似于logN、NlogN的曲线。原创 2017-02-26 23:08:22 · 985 阅读 · 1 评论 -
JavaScript实现二分查找
最近撸《算法》第四版,开篇就是一个Java版本的二分查找算法,下面以JS实现一下。 二分查找的前提为:数组、有序。逻辑为:优先和数组的中间元素比较,如果等于中间元素,则直接返回。如果不等于则取半继续查找。/** * 二分查找,递归实现。 * @param target * @param arr * @param start * @param end * @returns {*} */原创 2017-02-22 01:14:38 · 6795 阅读 · 6 评论 -
基础数据结构03:栈
介绍 栈是一种后进先出的数据结构。栈类似于一截一端封口的竹筒,不断像竹筒中放入东西,然后不断从中取出东西,最后放进竹筒中的东西总是最先被取出来,最先放进竹筒里的东西由于在竹筒的最底部,总是最后被取出来。Java实现 使用链表来实现栈的数据结构。也可以使用数组来实现,需要额外实现数组大小的动态增加和缩小。package com.algs.base;import java.util.Iterator原创 2017-07-03 00:12:53 · 849 阅读 · 1 评论