常见的内部排序算法有:插入排序.希尔排序.选择排序.冒泡排序.归并排序.快速排序.堆排序.基数排序等.用一张图概括: 插入排序 插入排序(英语:Insertion Sort)是一种简单直观的排序算法.它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入.插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间. 插入排序和冒泡排序一样,也有一种…
栈(Stack)是限定仅在表尾进行插入或删除操作的线性表.表尾为栈顶(top),表头为栈底(bottom),不含元素的空表为空栈. 栈又称为后进先出(last in first out)的线性表. 堆栈可以用链表和数组两种方式实现,一般为一个堆栈预先分配一个大小固定且较合适的空间并非难事,所以较流行的做法是 Stack 结构下含一个数组.如果空间实在紧张,也可用链表实现,且去掉表头. 栈的链式表示结构图: 用js数组可以非常简单地实现栈的顺序表示,故这里不赘述.这里主要讲解一下栈的链式表示. /…
这是java高并发系列第26篇文章. 环境:jdk1.8. 本文内容 了解JUC常见集合,学会使用 ConcurrentHashMap ConcurrentSkipListMap ConcurrentSkipListSet CopyOnWriteArraySet 介绍Queue接口 ConcurrentLinkedQueue CopyOnWriteArrayList 介绍Deque接口 ConcurrentLinkedDeque JUC集合框架图 图可以看到,JUC的集合框架也是从Map.Lis…
的确,正如偶像Bruce Eckel所说,"Life is short, you need Python"! 如果你正在考虑学Java还是Python的话,那就别想了,选Python吧,你的人生会有更多的时间做其他有意思的事情. 研究生之前我没学python是有原因的:首先,我怕蛇,很怕很怕,而这货的logo竟然就是蛇,我因故而避之:其次,我不喜欢脚本语言,我会shell,但是写的时候不是很爽,只是在处理些文件操作或者字符串操作的时候才会想起它,听说python脚本神马的,我便又避之.…
常见的内部排序算法有:插入排序.希尔排序.选择排序.冒泡排序.归并排序.快速排序.堆排序.基数排序等. 用一张图概括:   选择排序 选择排序是一种简单直观的排序算法,无论什么数据进去都是O(n2) 的时间复杂度.所以用到它的时候,数据规模越小越好.唯一的好处可能就是不占用额外的内存空间了吧.通俗来说就是你们中间谁最小谁就出列,站到队列的最后边,然后继续对着剩余的无序数组说你们中间谁最小谁就出列,站到队列的最后边,一直到最后一个,继续站到最后边,这样数组就有了顺序,从小到大. 1.算法步骤 首先…
在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 为了不误人子弟耽误时间,推荐看一些靠谱的资源,如[啊哈!算法]系列: https://www.cnblogs.com/ahalei/p/3568434.html 他是C语言实现,其实都是一样的. 我总结一个清晰不罗嗦版: 原理: 快速排序使用分而治之策略.下面描述递归步骤: 选择一个pivot支点值(在啊哈算法中叫“基准值”).我们将中间元素的值作为支点值,但是它也可以是任何值,…
原文出自: http://www.nczonline.net/blog/2012/11/27/computer-science-in-javascript-quicksort/ https://gist.github.com/paullewis/1981455#file-gistfile1-js 快速排序(Quicksort)是对冒泡排序的一种改进,是一种分而治之算法归并排序的风格 核心的思想就是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然…
循环链表(circular linked list) 是另一种形式的链式存储结构.它的特点是表中最后一个结点的指针域指向头结点,整个表形成一个环. 循环链表的操作和线性链表基本一致,仅有细微差别. wiki 在一个 循环链表中, 首节点和末节点被连接在一起.这种方式在单向和双向链表中皆可实现.要转换一个循环链表,你开始于任意一个节点然后沿着列表的任一方向直到返回开始的节点.再来看另一种方法,循环链表可以被视为“无头无尾”.这种列表很利于节约数据存储缓存, 假定你在一个列表中有一个对象并且希望所有…
快速排序的基本思路是,每次选定数列中的一个基准数,将小于基准数的数字都放到基准数左边,大于基准数的数字都放到基准数右边.然后再分别对基准数左右的两个数列分别重复以上过程.仍以4 3 6 2 7 1 5为例. 选定最左侧数字4为基准数,首先从右开始向左找小于4的数,找到第一个数1后停止.然后从左开始向右找到第一个大于4的数,即6. 交换这两个数的位置,得到 继续寻找,仍然从右边开始,从上一步找到1的位置向左寻找小于4的数,找到2停止.然后从左边找到6的位置向右找大于4的数.右移一格后,和右侧来的"…
1.线性表(Linear list) 线性表--简单示例及线性表的顺序表示和实现 线性表--线性链表(链式存储结构) 线性表的静态单链表存储结构 循环链表与双向链表 功能完整的线性链表 线性链表的例子:一元多项式 2.栈(Stack) 栈 -- 顺序存储表示和链式表示及示例 3.队列(Queue) 队列 -- 链队列和循环队列实现及示例 4.串(String) 串--定长顺序存储表示以及kmp算法实现 串--堆分配存储表示 串的块链存储表示 5.数组(Array) 稀疏矩阵之三元组线性表表示 稀…