c/c++
文章平均质量分 67
heyuchang666
这个作者很懒,什么都没留下…
展开
-
字节存储排序:大端(big endian)和小端(little)的判别及转换
当前的存储器,多以byte为访问的最小单元,当一个逻辑上的地址必须分割为物理上的若干单元时就存在了先放谁后放谁的问题,于是端(endian)的问题应运而生了,对于不同的存储方法,就有大端(big-endian)和小端(little- endian)两个描述。字节排序按分为大端和小端,概念如下大端(big endian):低地址存放高有效字节小端(little endian):低字节存放地有效字节现在主流的CPU,intel系列的是采用的little endian的格式存放数据,而motoro原创 2015-07-09 18:46:15 · 3609 阅读 · 0 评论 -
梳排序(Comb sort)
梳排序(Comb sort)是一种由Wlodzimierz Dobosiewicz于1980年所发明的不稳定排序算法,并由Stephen Lacey和Richard Box于1991年四月号的Byte杂志中推广。梳排序是改良自泡沫排序和快速排序,其要旨在于消除乌龟,亦即在阵列尾部的小数值,这些数值是造成泡沫排序缓慢的主因。相对地,兔子,亦即在阵列前端的大数值,不影响泡沫排序的效能。 在泡沫排序中,只比较阵列中相邻的二项,即比较的二项的间距(Gap)是1,梳排序提出此间距其实可大于1,改自插入排序的希尔排序同原创 2016-01-21 12:09:48 · 1818 阅读 · 0 评论 -
珠排序Bead Sort
珠排序是一种自然排序算法,由Joshua J. Arulanandham, Cristian S. Calude 和 Michael J. Dinneen 在2002年发展而来,并且在欧洲理论计算机协会(European Association for Theoretical Computer Science,简称EATCS)的新闻简报上发表了该算法。无论是电子还是实物上的实现,珠排序都能在O(n)时间内完成;然而,该算法在电子上的实现明显比实物要慢很多,并且只能用于对正整数序列进行排序。并且,即使在最好的原创 2016-01-21 12:40:44 · 2000 阅读 · 0 评论 -
两个栈实现队列 两个队列实现栈
s1是入栈的,s2是出栈的。入队列,直接压到s1是就行了出队列,先把s1中的元素全部出栈压入到s2中,弹出s2中的栈顶元素;再把s2的所有元素全部压回s1中实现二思路 s1是入栈的,s2是出栈的。保证所有元素都在一个栈里面入队列时:如果s1为空,把s2中所有的元素倒出压到s1中;否则直接压入s1出队列时:如果s2不为空,把s2中的栈顶元素直接弹出;否则,把s1的所有元素全部弹出压入s2中,再弹出s2的栈顶元素比较:与实现一相比较,出队列时不必每次都捣鼓了。实现三思路原创 2015-12-07 11:29:35 · 986 阅读 · 1 评论 -
换种思路去理解设计模式(下)
对象行为与操作对象过程描述所谓对象行为和操作对象,需要三方面内容:l 操作过程:一般表现为一个方法。该方法接收一个对象或者组合类型的参数,然后对这个对象或者组合进行操作,例如修改属性、状态或者结构等。原创 2015-12-19 16:48:55 · 773 阅读 · 0 评论 -
八大排序算法(一)
排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部的排序记录,在排序过程中需要访问外存。当n较大,则应采用时间复杂度为O(nlog2n)的排序方法:快速排序、堆排序或归并排序序。 快速排序:是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短;原创 2015-08-04 13:36:57 · 7178 阅读 · 2 评论 -
String.Split()函数
split函数是编程语言中使用的函数,是指返回一个下标从零开始的一维数组,它包含指定数目的子字符串。转载 2016-06-17 14:53:24 · 6133 阅读 · 1 评论 -
String.Join
String.Join(seprater, string [] value) 注意它的两个参数 应该一个是分隔符一个是数组名字,它的作用就是把数组里的各个数组段利用 分隔符组合成一个字符串。通过上面的例子我们也可以看到它利用空格 把整个数组的内容组合成了一个但是上面还涉及到了String类的另一个方法 String .Split()函数 关于它的讲解 请参考:String .Split。转载 2016-06-17 14:54:42 · 4519 阅读 · 0 评论 -
C++引用作为函数参数
引用很容易与指针混淆,它们之间有三个主要的不同:1.不存在空引用。引用必须连接到一块合法的内存。2.一旦引用被初始化为一个对象,就不能被指向到另一个对象。指针可以在任何时候指向到另一个对象。3.引用必须在创建时被初始化。指针可以在任何时间被初始化。原创 2017-01-17 19:14:32 · 4445 阅读 · 0 评论 -
#ifndef/#define/#endif使用详解
“头文件中的 #ifndef/#define/#endif 防止该头文件被重复引用”。但是是否能理解“被重复引用”是什么意思?是不能在不同的两个文件中使用include来包含这个头文件吗?如果头文件被重复引用了,会产生什么后果?是不是所有的头文件中都要加入#ifndef/#define/#endif 这些代码?转载 2017-01-19 10:55:50 · 354 阅读 · 0 评论 -
C++ Null 指针
在变量声明的时候,如果没有确切的地址可以赋值,为指针变量赋一个 NULL 值是一个良好的编程习惯。赋为 NULL 值的指针被称为空指针。NULL 指针是一个定义在标准库中的值为零的常量。原创 2017-02-14 11:53:18 · 661 阅读 · 0 评论 -
C++ STL 详细总结
从逻辑层次来看,在STL中体现了泛型化程序设计的思想(generic programming),引入了诸多新的名词,比如像需求(requirements),概念(concept),模型(model),容器(container),算法(algorithmn),迭代子(iterator)等。与OOP(object-oriented programming)中的多态(polymorphism)一样,泛型也是一种软件的复用技术;从实现层次看,整个STL是以一种类型参数化(type parameterized)的方式转载 2017-03-30 17:01:30 · 781 阅读 · 0 评论 -
c++关键字之:volatile
volatile 是“易变的”、“不稳定”的意思。volatile是 c++ 的一个关键字,用来解决在“共享”环境下容易出现的读取错误的问题。在单任务的环境中,一个函数体内部,如果在两次读取变量的值之间的语句没有对变量的值进行修改,那么编译器就会设法对可执行代码进行优化。由于访问寄存器的速度要快过RAM(从RAM中读取变量的值到寄存器),以后只要变量的值没有改变,就一直从寄存器中读取变量的值,而不对RAM进行访问。转载 2017-03-30 19:19:09 · 818 阅读 · 0 评论 -
模板与泛型的区别
泛型和模板都提供支持参数化类型的语言功能。但是,它们是不同的,有不同的用途。本主题提供了一个概述的许多差异。泛型是通用的,直到它们在运行时类型取代。模板是专门在编译的时候,所以他们不仍然在运行时的参数化类型。特别是公共语言运行库支持仿制药在MSIL。由于运行时知道仿制药,具体类型可以被取代时,泛型类型的引用程序集包含一个泛型类型。相比之下,模板,解决成普通类型在编译时产生的类型可能不会专门在其他组件中。 专门在两个不同的组件与同类型参数的泛型是相同的类型。专门在两个不同的组件与同类型参数的模板被认为是由运行转载 2017-03-31 11:43:42 · 3769 阅读 · 2 评论 -
C/C++ typedef用法
typedef 声明,简称 typedef,为现有类型创建一个新的名字。比如人们常常使用 typedef 来编写更美观和可读的代码。所谓美观,意指 typedef 能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性和以及未来的可维护性。在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。转载 2017-03-31 17:39:05 · 597 阅读 · 0 评论 -
进程和线程关系及区别
1.定义进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.转载 2018-02-01 19:06:17 · 275 阅读 · 0 评论 -
new、delete、malloc、free关系
1.new、delete、malloc、free关系 delete会调用对象的析构函数,和new对应free只会释放内存,new调用构造函数。malloc与free是C++/C语言的标准库函数,new/delete是C++的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用maloc/free无法满足动态对象的要求。对象在创建的同时要自动执行构造函数,对象在消...原创 2015-11-11 22:52:50 · 1612 阅读 · 0 评论 -
#define和const的区别
在C语言中常用#define命令来定义符号常量:#define PI 3.14159实际上,只是在预编译时进行字符置换,把程序中出现的字符串PI全部换成3.14159。在预编译之后,程序中不再有PI这个标识符。PI不是变量,没有类型,不占用存储单元,而且容易出错,如:int a = 1;b = 2;#define PI 3.14159#define R a + bcout << ...原创 2018-02-10 18:05:09 · 1486 阅读 · 0 评论 -
奇偶排序Odd-even sort
奇偶排序Odd-even sort参看 维基百科的定义又一个比较性质的排序,基本思路是奇数列排一趟序,偶数列排一趟序,再奇数排,再偶数排,直到全部有序原创 2016-01-21 11:52:35 · 2783 阅读 · 0 评论 -
鸡尾酒排序
鸡尾酒排序 鸡尾酒排序也就是定向冒泡排序, 鸡尾酒搅拌排序, 搅拌排序 (也可以视作选择排序的一种变形), 涟漪排序, 来回排序 or 快乐小时排序, 是冒泡排序的一种变形。此演算法与冒泡排序的不同处在于排序时是以双向在序列中进行排序。原创 2016-01-17 00:56:58 · 807 阅读 · 0 评论 -
复杂链表的复制(二)
有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。如果没有random pointer那是极容易的,顺着链表走读一遍 ,逐个拷贝节点并链接即可,有了random pointer后,其实也就是加上了记录random pointer的关系而已,考虑到random pointer可以往前指,也可以往后指,则必须全部遍历完才能完整地建立起random pointer对应关系表,记录对应关系,当然用map的数据结构啦,c++不太熟,查了下原创 2015-12-14 23:11:43 · 429 阅读 · 0 评论 -
C++快速排序算法
快速排序是一种排序算法。在平均状况下,排序n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 演算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实作出来,且在大部分真实世界的资料,可以决定设计的选择,减少所需时间的二次方项之可能性。原创 2015-08-04 11:37:54 · 770 阅读 · 0 评论 -
随机数函数大全
每种编程语言一般都有生成随机数函数(也称为方法),为了便于使用,文章总结常用编程语言的随机数函数,主要包括 C#、C++、C语言、PHP、Java、Javascript、vbscript、VB、Delphi、fortran、pascal、perl、prolog、python、ruby、MsSql、MySql、Oracle。原创 2015-11-06 16:45:23 · 6338 阅读 · 0 评论 -
C/C++多态性(polymorphism)虚函数
从系统实现的角度,多态性分为两类:静态多态性和动态多态性。函数重载和运算符重载实现的多态性属于静态多态性,在程序编译时系统就能决定调用的是哪个函数,因此有称为编译时的多态。静态多态性是通过函数的重载实现的(运算符重载实质上也是函数的重载)。动态多态性是在程序运行过程中才动态地确定操作所针对的对象。它又称为运行时的多态性。动态多态性是通过虚函数(virtual function)实现的。原创 2015-10-23 17:25:36 · 947 阅读 · 0 评论 -
八大排序算法(二)
交换排序1)选择一个基准元素,通常选择第一个元素或者最后一个元素,2)通过一趟排序讲待排序的记录分割成独立的两部分,其中一部分记录的元素值均比基准元素值小。另一部分记录的 元素值比基准值大。3)此时基准元素在其排好序后的正确位置4)然后分别对这两部分记录用同样的方法继续进行排序,直到整个序列有序。快速排序的示例:(a)一趟排序的过程:原创 2015-08-04 13:44:48 · 2121 阅读 · 0 评论 -
数据结构—队列
队列是一种先进先出(FIFO)的线性表,它只允许在表的一端插入元素,而在表的另一端删除元素。在队列中,允许插入的一端称为队尾(rear),允许删除元素的一端称为队头(front)。原创 2015-10-23 21:58:45 · 6373 阅读 · 0 评论 -
指针数组、数组指针、指针函数、函数指针、函数指针数组、对象指针解析
指针是一个存储计算机内存地址的变量。在这份教程里“引用”表示计算机内存地址。从指针指向的内存读取数据称作指针的取值。指针可以指向某些具体类型的变量地址,例如int、long和double。指针也可以是void类型、NULL指针和未初始化指针。原创 2015-10-23 20:20:51 · 730 阅读 · 0 评论 -
掌趣2016校招大题
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。进行二分查找的前提是数组已排原创 2015-10-23 22:03:48 · 1436 阅读 · 0 评论 -
将链表中的所有元素为奇数的节点移到元素为偶数节点的前面,并保证奇数之间顺序不变,偶数之间顺序不变(创新工场)
将链表中的所有元素为奇数的节点移到元素为偶数节点的前面,并保证奇数之间顺序不变,偶数之间顺序不变(创新工场)原创 2015-11-11 11:03:21 · 1980 阅读 · 1 评论 -
数据结构—栈
(一)栈的定义及基本运算(1)栈的定义 栈是只能通过访问它的一端来实现数据存储和检索的一种线性数据结构。换句话说,栈的修改是按先进后出的原则进行的。因此,栈又称为先进后出(FILO)的线性表。在栈中进行插入和删除操作的一端称为栈顶(top),相应地,另一端称为栈底(bottom)。不含数据元素的栈称为空栈。(2)栈的基本算法初始化栈InitStack(S):创建原创 2015-10-30 19:36:18 · 14350 阅读 · 2 评论 -
有15个数存放在一个数组中,输入一个数,要求用折半法找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。以15个数用赋初值的方法在程序中给出。要找的数用scanf函数输入。
有15个数存放在一个数组中,输入一个数,要求用折半法找法找出该数是数组中第几个元素的值。如果该数不在数组中,则输出“无此数”。以15个数用赋初值的方法在程序中给出。要找的数用scanf函数输入。原创 2015-11-17 16:34:58 · 9397 阅读 · 2 评论 -
C语言1.用选择法对10个整数排序。10个整数用scanf函数输入。
用选择法对10个整数排序。10个整数用scanf函数输入原创 2015-11-17 16:32:46 · 43042 阅读 · 2 评论 -
将两个字符串连接起来,不要用strcat函数。
将两个字符串连接起来,不要用strcat函数。原创 2015-11-17 16:39:10 · 55549 阅读 · 10 评论 -
找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点。
找出一个二维数组的“鞍点”,即该位置上的元素在该行上最大,在该列上最小。也可能没有鞍点。原创 2015-11-17 16:40:58 · 9717 阅读 · 0 评论 -
数据结构—散列表(Hash table,也叫哈希表)
散列表(Hash table,也叫哈希表)是一种查找算法,与链表、树等算法不同的是,散列表算法在查找时不需要进行一系列和关键字(关键字是数据元素中某个数据项的值,用以标识一个数据元素)的比较操作。 散列表算法希望能尽量做到不经过任何比较,通过一次存取就能得到所查找的数据元素,因而必须要在数据元素的存储位置和它的关键字(可用key表示)之间建立一个确定的对应关系,使每个关键字和散列表中一个唯一的存储位置相对应。因此在查找时,只要根据这个对应关系找到给定关键字在散列表中的位置即可。这种对应关系被称为散列原创 2015-11-23 16:12:40 · 8732 阅读 · 1 评论 -
关于指针详解
0.预备知识,最基础的指针其实最基础的指针也就应该如下面代码:int a;int* p=&a;也就是说,声明了一个int变量a,然后声明一个int 的指针,*p指向a的地址,&也就是取地址符号,而*是指针中取内容的符号,仅仅在声明的时候标记这个变量是指针.可能有点绕口,但是看代码来的容易的多...原创 2015-12-12 18:06:00 · 504 阅读 · 0 评论 -
C++中的友元函数的总结
在实现类之间数据共享时,减少系统开销,提高效率。如果类A中的函数要访问类B中的成员(例如:智能指针类的实现),那么类A中该函数要是类B的友元函数。具体来说:为了使其他类的成员函数直接访问该类的私有变量。即:允许外面的类或函数去访问类的私有变量和保护变量,从而使两个类共享同一函数。实际上具体大概有下面两种情况需要使用友元函数:(1)运算符重载的某些场合需要使用友元。(2)两个类要共享数据的时候。原创 2015-12-12 18:14:24 · 687 阅读 · 0 评论 -
复杂链表的复制
Q:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。请完成函数ComplexNode* Clone(ComplexNode* pHead),以复制一个复杂链表。A:一开始想这道题毫无思路,如果蛮来,首先创建好正常的链表,然后考虑sibling这个分量,则需要O(n^2)的时间复杂度,然后一个技巧便可以巧妙的解答此题。看图便知。原创 2015-12-14 23:06:55 · 581 阅读 · 0 评论 -
函数重载 和 模版template
假设,需要设计一个从3个数中找最大值的函数,C语言中需要根据类型定义3个函数:int max1(int a, int b, int c);float max2(float a, float b, float c);long max3(long a, long b, long c);C语言规定在同一作用域中不能有同名的函数,因此3个函数名字不同,C++中用允许同一函数名定义多个函数,这些函数的参...原创 2018-02-10 18:41:09 · 531 阅读 · 0 评论