C++
风裳
好好学习,天天向上。
展开
-
八大排序之——快速排序(快排)及其优化
快速排序,是一个较为高效的不稳定排序算法,其排序效率在同为O(N*logN)的几种排序算法当中也较为高效,使用率可谓名列前茅,尽管它是一种不稳定的排序算法(排序的过程中相等的值的位置可能有所变化),但仍然十分受欢迎。其核心思想是选中一个基点,通过一次排序操作将整个序列划分为两个子序列,左子序列的值都比基点要小,右子序列的值都比基点要大,按照该方法又对两个子序列进行快排操作,不断地重复上面的操作,最后达到全部的序列都排序好,使整个序列排序为有序数列。其算法思想的本质也是分治策略,对数据分布越乱的序列排序效率越原创 2020-06-30 22:23:58 · 685 阅读 · 0 评论 -
八大排序之——归并排序
归并排序,是一个建立在归并操作基础上的一种排序算法, 该算法也是运用了分治策略的思想,通过不断地二等分子序列,将其排序至有序,再合并回序列里,最终达到排序的目的。归并排序是一个比较稳定的排序算法。其速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。其算法原理如下:1.申请一个与待排序序列大小相等的空间,用于临时存放排序结果。2.取待排序序列的中间为界,将划分出的两个子序列进行归并排序,反复二等分并进行归并排序3.将归并好的子序列合并存储至临时空间当中,并将存储好的结果原创 2020-06-30 13:25:54 · 276 阅读 · 0 评论 -
浅析二分查找法:这么好用的方法必须学会!
二分查找法,又称折半查找法,它是一种效率比较高的查找方法,适用于按顺序存储结构,且表中的元素是按关键字有序排序的线性表当中。时间复杂度为O(lg n)。在一定的情况下,二分查找法是特别高效的选择。二分查找法的核心思想是分治策略,在有序排序的线性表里,如果待查询的值小于中间的值的话,那么待查询的值绝对只可能在起始到中间的范围当中,同理如果大于中间的值都会话,就只可能在中间到末尾的范围里。通过每一次比较,我们可以不断缩小查询的范围,如果待查询的值在线性表当中存在的话,那么最后待查询的值会等于某一次缩小到的范围原创 2020-06-29 22:36:00 · 406 阅读 · 0 评论 -
剑指Offer系列(04):二维数组中的查找
题目是这样的:在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。做这道题其实不难,首先我们先在题目中抓取关键字:行是递增顺序排序、列从上到下递增。看到递增与查找,不难联想到二分查找法(折半查找法)。而且从左到右和从上到下都是递增的话,那么查找目标如果小于第一行的第一个元素或者大于最后一行的最后一个元素的话,绝对可以说是查找不到的;同时对于行而言,如果查找目标比行当中的第一个元原创 2020-06-26 00:25:07 · 118 阅读 · 0 评论 -
探秘C++中的Const(一)Const在C语言与C++中的区别
这期博客我们来讲贯穿C++中的一个十分重要的修饰词:Const。一般我们知道:**Const修饰过的变量再也不能做为左值了,且值初始化完成后是不能被修改的。**那么这句话的真正意思你理解了吗?首先我们来看看C语言与C++中Const最本质的区别:Const的编译方式不同。在C语言中,Const修饰的变量是当做一个变量来编译生成指令的。怎么来理解这句话呢?就是说Const尽管修饰了一个变量,但这个变量的本质并不会变成一个 常量,无法修改,而是变成了一个叫常变量的东西。常变量可以不初始化,但赋值只有在初始化原创 2020-06-12 18:41:43 · 190 阅读 · 0 评论 -
浅析C++中的函数重载
来分析函数重载之前,我们先引用一个小问题:为什么C++支持函数重载,C语言不支持函数重载?答案很简单,因为C++代码产生函数符号的时候,是由函数名+参数列表类型组成的;而C代码产生函数符号的时候,符号由函数名决定。正是因为有了这样的情况,C++里就出现了“函数重载”这样一个情况。下面让我们看一个简单的例子,来了解函数重载。#include <iostream>using nam...原创 2020-03-26 16:41:00 · 168 阅读 · 0 评论 -
inline函数和普通函数的区别
inline函数和普通函数有什么区别?要更有深度的回答这个问题,我们先从inline函数的角度来进行剖析,下面先看一个简单的示范代码:#include <iostream>using namespace std;int sum(int x, int y){ return x + y;}int main(){ int a = 5; int b = 9; int ...原创 2020-03-25 22:40:28 · 1766 阅读 · 1 评论 -
进程中虚拟地址空间区域的划分
代码在编译连接完成后,都会产生一个放在磁盘上的可执行文件.exe,当我们运行exe文件时会把程序从磁盘上加载到内存当中(这里说的内存不是物理内存,而是虚拟内存)。那么进程中的虚拟地址空间又是怎么划分的呢?以x86体系下的32位linux环境下来看,linux系统会给当前进程分配一个2^32大小的一块空间,也就是4G大小的空间,当然如果是在64位下地址空间划分又是不同的。这里4G当中3G被分为用户...原创 2020-03-07 00:03:24 · 561 阅读 · 0 评论 -
简述new和malloc的区别
new和malloc都是动态分配内存的指令,它们的区别主要为以下五点:1.申请内存所在位置不同new从自由存储区上为对象动态分配内存空间malloc从堆上动态分配内存2.返回类型的安全性new内存分配成功时,返回对象类型的指针,安全Malloc成功时返回void*,需要强转3.分配内存失败时的结果不同new分配内存失败时,会抛出bac_alloc异常malloc内存分配失败时返回...原创 2020-02-18 15:35:06 · 1747 阅读 · 0 评论 -
C++下源文件变成可执行文件的过程
C/C++下的源文件想要运行,都是经过了汇编等一系列操作,从代码变为了机器语言。假设项目下有源文件a.cpp,其变成可执行文件经历了四个过程:1. 预编译:(1)将a.cpp中的#include递归(2)将a.cpp中的#define替换(3)删除#if和#endif(4)删除注释//和/**/(5)增加行号和文件标识(6)保留 #pragma2. 编译:(1)进行词法分析(2...原创 2020-02-18 15:30:08 · 851 阅读 · 0 评论