深层次两张图解经典6大排序与6大基础数据结构——学完这些,妈妈再也不用担心我的排序算法与数据结构

本文从冒泡排序撩起,对选择、插入、希尔、归并、快排6种经典的数组排序进行了深入分析,并详解其间的关联,让你深刻理解其中的关键点;同时对经典的数据结构Vector、Stack、Queue、树、Map、Set做了归纳总结,对其底层的实现做了解析,分享给大家,作为每一个中高级程序员应该懂得的算法与排序,祝大家早上走上自己的“成金之路”。

目录:

1.排序算法

2.数据结构

3.资料参考

1.排序算法:

a.起源:

计算机从诞生起,就在模拟人这种智能生物的行为,而排序也来自于日常生活中,最经典的冒泡排序即来源于水泡从水底升上水面,离水面越近,水泡体积越大——由此诞生的冒泡排序思想即为:依次遍历每个元素,如果前一个比后一个大,则交换两者的位置。

其缺点有二:第一点每次比较都会产生交换元素的行为,效率低;第二点,算法复杂度为O(n^2)

b.针对缺点一的优化:

选择排序:即每次遍历只记录最大元素的下标,最后进行元素交换;

插入排序:当输入有序程度较高时,通过构建有序数组,并将新元素插入到有序数组中,完成整体的排序,降低元素交互的次数,缺点是不稳定;

希尔排序:插入排序稳定稳定程度太低,因此通过主动构建有序对(间隔n、n/2、n/4...1的有序对),来提升“插入排序”的稳定性,是插入排序的一种改进。

c.针对缺点二的优化:

归并排序:采用“分治算法思想”,将输入一分为二,分别排序,通过“并行”思想来提升算法效率,复杂度为O(nlgn),但是需要额外的arr[n]空间,来进行合并;

快速排序:对归并排序的改进,在不需要额外空间的情况下,对数组遍历,按对选定元素的比较进行划分,小的集中在左边,大的集中在右边;分别对两边进行排序——整体的思路与构建二叉树一致,其复杂度为O(nlgn)。

d.伪代码总结如下:

2.数据结构:

教学视频参考斯坦福公开课《抽象编程》,地址为http://open.163.com/special/opencourse/abstractions.html

这里对主要的数据结构进行了拆解,如下图

上图只是详解了其底层的结构,但是涉及到使用时,还需要提供一些常见接口,供调用者使用,如size()、iterator()/hasnext()/next()x、add()/remove()、contain()、isEmpty()等;见代码实现分享链接:http://pan.baidu.com/s/1hsoReNa 密码:h9q0。

另,附上《抽象编程》总结笔记,链接:http://pan.baidu.com/s/1jI6xZtc 密码:4ik0,希望大家对数据接口及常见的排序有个更深层次的认识,编程时不仅仅会用,还要体会其底层实现,以最高效的方式,来完成程序,走上自己的“成金之路”;另,转载请注明出处(百度搜“成金之路 博客园”)。请不吝“推荐”

3.参考资料:

6个算法JAVA实现:http://www.cnblogs.com/uttu/archive/2013/02/07/2908793.html

MIT算法总结:http://www.cnblogs.com/uttu/category/451653.html

时间: 2024-10-08 02:41:51

深层次两张图解经典6大排序与6大基础数据结构——学完这些,妈妈再也不用担心我的排序算法与数据结构的相关文章

大数据学完能干什么,大数据就业方向有哪些

我们都知道大数据就业前景好.但学完大数据能找什么工作呢?大数据的就业方向有哪些呢?这是很多同学的困惑. 一.学习大数据的优势是什么?大数据的发展前景很火,根据调查显示,"月薪过万""职位稀缺""需求大""人才缺口大",这些词汇已经成为时下媒体记者和商业行业对大数据的代名词.也是很多求职者蠢蠢欲动想要加入到最火热的信息技术"大数据"行业中.国家的支持,大力发展大数据行业.各行各业的发展各个企业的大力需求,目前

(转) 一张图解AlphaGo原理及弱点

一张图解AlphaGo原理及弱点 2016-03-23 郑宇,张钧波 CKDD 作者简介: 郑宇,博士, Editor-in-Chief of ACM Transactions on Intelligent Systems and Technology, ACM数据挖掘中国分会秘书长. 张钧波,博士,ACM数据挖掘中国分会会员,从事深度神经网络相关研究. -------------------------------------- 近期AlphaGo在人机围棋比赛中连胜李世石3局,体现了人工智能

硬不硬你说了算!35 张图解被问千百遍的 TCP 三次握手和四次挥手面试题

每日一句英语学习,每天进步一点点: 前言 不管面试 Java .C/C++.Python 等开发岗位, TCP 的知识点可以说是的必问的了. 任 TCP 虐我千百遍,我仍待 TCP 如初恋. 遥想小林当年校招时常因 TCP 面试题被刷,真是又爱又狠…. 过去不会没关系,今天就让我们来消除这份恐惧,微笑着勇敢的面对它吧! 所以小林整理了关于 TCP 三次握手和四次挥手的面试题型,跟大家一起探讨探讨. TCP 基本认识 TCP 连接建立 TCP 连接断开 Socket 编程 PS:本次文章不涉及 T

任意两张带透明图像的一种形状过渡效果

一直想要一个Flash 那种形状渐变效果,这两天苦思冥想了一番实现了,先看效果. 一开始是往把贴图alpha通道识别成路径,建模想办法拉顶点的方向去,想来想去不是个好办法,后来还是决定直接基于位图实现,尽量采用gpu可以处理的方式. 然后往这边思考后,脑子里就浮现出了ditance field 这个概念,alpha表达的还是颜色,直接插值alpha会呈现出颜色渐变的结果. 而distance field 反映的是离边的远近,插值他就会呈现出每个像素离边的距离的变化. 确定方案后就是实现了. 我采

SQLSERVER中如何快速比较两张表的不一样

一般来说,如何检测两张表的内容是否一致,体现在复制的时候发布端和订阅端的两端的数据上面 我这里罗列了一些如何从数据库层面来解决此类问题的方法 第一步当然就是检查记录数是否一致,否则不用想其他方法了~这里我们用两张表t1_old,t1_new来演示 方法介绍 方法一:老老实实看表结构和表记录数,弊端是根本看不到两张表的数据是否一致,只是看到表结构和记录数是否一致 --表结构: CREATE TABLE t1_old ( id int NOT NULL, log_time DATETIME DEFA

从两张Excel表所想到的

前几日,客服妹子发过来几张表,让我给她做下匹配,然后做了,想了,便有了这篇博文,不由感慨,看似简简单单的两张Excel表其实藏着好多东西,记叙如下,与君共勉. 最初的需求:两张表,一张学生信息表,一张学生成绩表,通过准考证号将之关联起来使之完整. 完成需求的四种方法: 第一种方法,通过Navicat for MySQL将两张表导入到mysql中,然后用left join关联,再做导出,方法可行,最后放弃. 第二种方法 ,使用Excel的vlookup函数,由于本人对Excel不熟,未用,但旁边的

mysql将一张表拆分两张表来使用

"SELECT n1.id, n1.nav_name, n1.nav_info, n2.id iid, n2.nav_name nnav_name FROM cms_nav n1 LEFT JOIN cms_nav n2 ON n1.pid=n2.id WHERE n1.id='$this->id' OR n1.nav_name='$this->nav_name' LIMIT 1" 中国军事 id=26 它的 pid=1 通过pid=1找到他的主类, id=pid=1 id

thinkphp + easyUI 不能同时打开两张数据表?

两个linkbutton分别打开一个数据库中不同的两张数据表 现在单独打开两个是可以正确显示的. 但是如果打开了一个linkbutton1,不关掉tabs中对应的linkbutton1,再打开linkbutton2,这时linkbutton2 显示不了数据,但是如果关掉linkbutton1,再打开linkbutton2,是可以正确显示的. 求解 --------解决方案-------- 这是不可能的!thinkphp 每个表是一个对象,不可能出现你说的现象

mysql高效获取两张表共同字段的交集数据

问题: 例如下面两站表A,B.A表和B表分别有5-10w数据.A表结构如下:id bid name title publisher extraB表结构如下id bid name title publisher A出版社也为很多人出版了书籍,B出版社也为很多人出版了书籍,有sql语句找出这两个出版社为那些人 共同出版书籍,用innerjoin太慢,有没有什么更好的办法? 解答一: 由于不知道你表的索引情况,至于用join还是in和exists不太好说,理论上讲,exists最快.in次之.join