![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C++
文章平均质量分 52
LRJ1207
这个作者很懒,什么都没留下…
展开
-
排序算法- 归并算法
归并排序:(时间复杂度O(N*lg(N)))思想:把数组划分为两段区间,假设两段区间都有序,则合并的区间也有序。 步骤:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 设定两个指针,最初位置分别为两个已经排序序列的起始位置 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置 重复步骤3直到某一指针达到序列尾代码: ...原创 2018-03-22 18:17:12 · 259 阅读 · 0 评论 -
链表面试题
1.从尾到头打印单链表 //O(N^2)void PrintTailToHead(SListNode* head){ SListNode* end = NULL; while (end != head) { SListNode* cur = head; while (cur->_next != end) { ...原创 2018-08-26 00:48:47 · 215 阅读 · 0 评论 -
文件压缩
过程统计文件中字符出现的次数,利用数据结构中的堆建造Huffman树,字符出现次数多的编码短,出现次数少的编码长;根据建造好的Huffman树形成编码,以对文件进行压缩;将文件中出现的字符以及他们出现的次数写入配置文件,以便后续的解压缩;根据配置文件读取相关信息,重建Huffman树,对压缩后的文件进行译码。首先观察解压的文件和原文件是否相同,再通过Beyond Compare 4软...原创 2018-07-15 15:35:21 · 634 阅读 · 0 评论 -
排序算法-快速排序
快速排序:(时间复杂度O(N^2))方法一:左右指针法(递归,划分为子问题) 注:end的起始位置就是key的位置 步骤: 1.从数列中挑出一个元素,key 2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。 3.递归地(re...原创 2018-03-21 21:33:15 · 230 阅读 · 0 评论 -
排序算法-冒泡排序
冒泡排序:(时间复杂度O(N^2))它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。冒泡排序要控制的是最后终止的位置 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素作同样的工作,从开...原创 2018-03-21 21:22:42 · 169 阅读 · 0 评论 -
排序算法-堆排序
堆排序:(时间复杂度O(N*lg(N)))借助二叉树的思想,将数据看作为静态二叉树(用来表示完全二叉树) 排成升序的话,建大堆(根节点大于等于孩子) 开始排序时要保证每个根节点的左右子树都为大堆,才能进行向下调整算法 1.找第一个非叶子结点(最后一个结点的父亲),对它进行向下调整算法(如果该节点比左右孩子大,则这个就是大堆,否则与大的那个孩子进行交换) 2.调整完成之后,将根...原创 2018-03-21 21:20:41 · 177 阅读 · 0 评论 -
排序算法-选择排序
选择排序:(时间复杂度O(N^2))首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕。选出数组中最小的数的下标 选出一个最小的和一个最大的(下标),依次放在左边和右边,为begin和end,然后begin++,end–之后,在begin和end区间再去选择两个数,依次放左边和右边…...原创 2018-03-21 21:17:29 · 179 阅读 · 0 评论 -
排序算法-希尔排序
希尔排序:(时间复杂度O(N^2),平均情况下O(N^1.3 ))有两个阶段 1.预排序 — — 接近于有序 2.直接插入排序 定义一个gap,对数据进行分组,间距为gap的为一组。对这几组数据按分组进行排序(组内插入排序) gap越小,越接近于有序(数组越大gap越大,数组越小,gap越小),gap为1时为有序。例如:10000 3000 1000 300 100 30 10...原创 2018-03-21 21:15:38 · 210 阅读 · 0 评论 -
排序算法-插入排序
插入排序:(时间复杂度O(N^2)) //是所有N^2排序中最好的它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。 一个数组,未排序,那么我们将第一个数字看作一个...原创 2018-03-21 21:12:47 · 841 阅读 · 0 评论 -
解析C++中函数重载的实现原理
什么是函数重载?函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数。重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避免了名字空间的污染,对于程序的可读性有很大的好处。剖析C++是如何实现重载的?几个同名的重载函数仍然是不同的函数,它们是如何区分的呢?我们自然想到函数接口的两个要素: 参数与返回值。如果同名函数的参数不...原创 2017-07-29 15:54:33 · 391 阅读 · 0 评论 -
C++:指针、引用和CONST
什么是引用引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。 引用的声明方法:类型标识符 &引用名=目标变量名;什么是const引用const引用是指向const的引用,其实这样说也不恰当,和const指针一样,const引用可以与常量绑定,也可以与变量绑定,只是不能通过这个const引用来改变绑定对象的值。对const的引用,常简称为”常量引用”...原创 2017-07-29 16:23:34 · 394 阅读 · 0 评论 -
为什么模板不支持分离编译
什么是模版的分离编译?如图所示 我们先来简单的分析一下,编译器报的这种错误属于链接性错误,也就是当程序预处理、编译、汇编、链接,在链接时出现了错误。而一般出现链接错误,通常是因为,声明了一个函数,但是没有写实现体.因此,当程序在链接时,从符号表中只找到了函数名,找不到具体函数实现的地址,因此编译器会报出这样的错误!为什么当模板在分离编译时会报出这样的错误呢?我们知道模板需要两次编...原创 2017-09-26 14:36:39 · 333 阅读 · 0 评论 -
C++ 智能指针
在 c 和 c++ 中,通过访问指针对象存储的地址,可以实现对内存的直接操作,但在实际工程中,由于复杂情况下意料外的程序跳转,程序很可能出现内存泄漏。int* p = new int(1);//若干代码 if (p){ return } //若干代码 delete p;因此我们引入「智能指针」智能指针的历史智能指针是 RAII(Resource A...转载 2018-08-26 01:06:33 · 193 阅读 · 0 评论