排序与基础数据结构

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。

时间: 2024-10-10 14:06:58

排序与基础数据结构的相关文章

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

本文从冒泡排序撩起,对选择.插入.希尔.归并.快排6种经典的数组排序进行了深入分析,并详解其间的关联,让你深刻理解其中的关键点:同时对经典的数据结构Vector.Stack.Queue.树.Map.Set做了归纳总结,对其底层的实现做了解析,分享给大家,作为每一个中高级程序员应该懂得的算法与排序,祝大家早上走上自己的"成金之路". 目录: 1.排序算法 2.数据结构 3.资料参考 1.排序算法: a.起源: 计算机从诞生起,就在模拟人这种智能生物的行为,而排序也来自于日常生活中,最经典

内部排序实现(数据结构)

以下源码全部经过测试,有些地方可能不是最优,仅是练习.如果错误或更好的方法欢迎大家指出.以下仅供参考: 说明:为了测试的方便,在每个排序算法前都进行了一次初始化-重新分配内存,以防止影响后面的测试.cygwin下G++测试通过 #include <cstdio> #include <cmath> #include <queue> #include <climits> #include <cstring> #include <cstdlib&

uva 11997 (基础数据结构)

题意: 有一个k*k 的方阵,让你从当中每一行挑选一个数字相加最后能得到K^K次方的和,输出其中最小的k个. 思路:先对每一行排序然后两两归并,每次取前k个再和下一行再进行归并.在归并的时候用一个优先队列维护最大的k个值每次先放k个进去然后一次每行和队顶比较,若是小则替换否则break最后输出即可. 代码如下: 1 #include <stdio.h> 2 #include <algorithm> 3 #include <iostream> 4 #include <

浅析基础数据结构-二叉堆

如题,二叉堆是一种基础数据结构 事实上支持的操作也是挺有限的(相对于其他数据结构而言),也就插入,查询,删除这一类 对了这篇文章中讲到的堆都是二叉堆,而不是斜堆,左偏树,斐波那契堆什么的 我都不会啊 一.堆的性质 1.堆是一颗完全二叉树 2.堆的顶端一定是“最大”,最小”的,但是要注意一个点,这里的大和小并不是传统意义下的大和小,它是相对于优先级而言的,当然你也可以把优先级定为传统意义下的大小,但一定要牢记这一点,初学者容易把堆的“大小”直接定义为传统意义下的大小,某些题就不是按数字的大小为优先

redis 基础数据结构实现

参考文献 redis数据结构分析 Skip List(跳跃表)原理详解 redis 源码分析之内存布局 Redis 基础数据结构与对象 Redis设计与实现-第7章-压缩列表 在redis中构建了自己的底层数据结构:动态字符,双端链表,字典,压缩列表,整数集合和跳跃表等.通过这些数据结构,redis构造出字符串对象,列表对象,哈希对象,集合对象和有序集合对象这5种我们常用的数据结构.接下来将从底层数据结构开始,一步步介绍redis的数据结构的实现 动态字符串 在redis中并没有使用c语言原生的

2.【Redis系列】Redis基础数据结构

原文:2.[Redis系列]Redis基础数据结构 千里之行始于足下,我们先来看看redis的基础知识. Redis有5中基本数据类型:字符串(string).列表(list).集合(set).有序集合(zset).字典(hash).熟练掌握这5种基本数据结构也是最基本最重要的部分. String(字符串) 字符串是redis中最简单的数据结构,Redis所有的数据结构都是以唯一key作为名称,然后通过唯一的key来获取相应的redis数据.不同类型的数据结构的差异就在于value的结构不一样.

java 基础数据结构

数据结构, 需要考虑两个方面: 1. 每个元素具体的存储方法 (java中是一个对象) 2. 元素之间的关系如何实现存储 (java中也是一个对象) 另外在java中, 已经可以把跟数据结构有关的一些方法写到一个类里了. 线性表 顺序表 c语言: 借助数组实现 #define INIT_SIZE 100; typedef struct { int elem[INIT_SIZE]; // 用来存储数组元素 int length; // 当前顺序表的长度 } SqList; // 元素之间的关系隐含

【UOJ#228】基础数据结构练习题 线段树

#228. 基础数据结构练习题 题目链接:http://uoj.ac/problem/228 Solution 这题由于有区间+操作,所以和花神还是不一样的. 花神那道题,我们可以考虑每个数最多开根几次就会成1,而这个必须利用开根的性质 我们维护区间最大.最小.和.区间加操作可以直接做. 区间开方操作需要特殊考虑. 首先对于一个区间,如果这个区间的所有数取$x=\left \lfloor \sqrt{x} \right \rfloor$值一样,那么就可以直接区间覆盖. 分析上述过程,一个区间可以

Flink内存管理源码解读之基础数据结构

概述 在分布式实时计算领域,如何让框架/引擎足够高效地在内存中存取.处理海量数据是一个非常棘手的问题.在应对这一问题上Flink无疑是做得非常杰出的,Flink的自主内存管理设计也许比它自身的知名度更高一些.正好最近在研读Flink的源码,所以开两篇文章来谈谈Flink的内存管理设计. Flink的内存管理的亮点体现在作为以Java为主的(部分功能用Scala实现,也是一种遵循JVM规范并依赖JVM解释执行的函数式编程语言)的程序却自主实现内存的管理而不完全依赖于JVM的内存管理机制.它的优势在