
数据结构与算法
薛定谔又死又生的猫
一天一题!
展开
-
1 插入排序
插入排序说明本来是想对插入排序做一个详细的说明——从算法原理、算法优劣、算法实现一一说起。但是要将算法原理说的通俗易懂,不是个简单的事情,常常需要很好的文笔和配上详细的图。但是最近需要复习准备面试,确实没什么时间去写一系列完整地说明算法的博客,所以这次就只是写下算法实现(C++代码)的细节和详细注释,找到新工作有空余时间后之后会陆续对这一系列算法进行详细说明。这一系列的算法博客不再赘叙...原创 2018-02-24 10:35:14 · 202 阅读 · 0 评论 -
2 归并排序
归并排序Profile说到归并排序,就不得不说道分治法。将原问题分解为几个规模较小但类似原问题的子问题,递归地求解这些子问题,然后再合并这些子问题的解来得到原问题的解。总结一下就是以下步骤:分解、解决、合并。对于归并排序来说(这个总结来自《算法导论》): - 分解:分解待排序的n个元素为两个子序列; - 解决:使用归并排序递归地排序两个子序列; - 合并:合并两个已排序的子序列产...原创 2018-02-24 11:50:50 · 230 阅读 · 0 评论 -
3 堆排序
堆排序Profile堆排序结合了插入排序(原地排序)和归并排序(时间复杂度)的优点。堆排序基于一种数据结构——堆。这里说的堆不是指JAVA虚拟机中存储对象的内存空间。堆分为最大堆、最小堆,不仅可以用来实现堆排序,更常见的是实现优先级队列,比如JAVA JDK中的PriorityQueue类就是以堆为数据结构基础实现的。这里暂且不写优先级队列的实现,实现成优先级队列,当然最好是写成一个类...原创 2018-02-24 18:10:10 · 280 阅读 · 0 评论 -
4 快速排序
快速排序Profile和归并排序一样,快速排序也使用分治思想。 -分解:将序列分成左右两部分; -解决:分别对左右部分进行排序; -合并:和归并排序不一样,子数组就在原地,所以不用合并,原数组就已经有序了。 快速排序的应用可就广泛了,C++STL中的sort()方法主体就是采用的三数取中快速排序,并搭配插入排序和堆排序以解决递归深度问题,和提升整体排序效率。快速排序的期望时间复杂度...原创 2018-02-25 10:01:14 · 377 阅读 · 0 评论 -
5 计数排序
计数排序Profile计数排序,顾名思义通过计数的方式来排序。计数排序不同于快速排序、归并排序,并不进行元素间的比较,因此可以突破时间复杂度O(nlgn)的下限,其时间复杂度为O(n)。基本思想是:确定小于等于元素的其他元素的个数,就确定了此元素的次序。前提要求元素属于[0, k]之间的数字。当然计数排序还有最最重要的一个性质:她是一个稳定的排序算法,即具有相同值得元素在输出数组中的相...原创 2018-02-25 11:48:23 · 325 阅读 · 0 评论