随笔分类 -  一步一步写算法

一步一步写算法(之链表逆转) (转)
摘要:链表逆转是面试环境中经常遇到的一道题目,也是我们在实际开发中可能会遇到的开发需求。和线性逆转不一样,单向链表的节点需要一个一个进行处理。为了显示两者之间的区别,我们分别对线性内存和链表进行逆转: (1)普通连续内存数据的反转分析boolnormal_revert(intarray[],intleng... 阅读全文

posted @ 2014-04-22 16:45 仅此而已_ 阅读(241) 评论(0) 推荐(0)

一步一步写算法(之循环单向链表) (转)
摘要:前面的博客中,我们曾经有一篇专门讲到单向链表的内容。那么今天讨论的链表和上次讨论的链表有什么不同呢?重点就在这个"循环"上面。有了循环,意味着我们可以从任何一个链表节点开始工作,可以把root定在任何链表节点上面,可以从任意一个链表节点访问数据,这就是循环的优势。 那么在实现过程中,循环单向链表有什... 阅读全文

posted @ 2014-04-22 16:02 仅此而已_ 阅读(247) 评论(0) 推荐(0)

一步一步写算法(之双向链表) (转)
摘要:前面的博客我们介绍了单向链表。那么我们今天介绍的双向链表,顾名思义,就是数据本身具备了左边和右边的双向指针。双向链表相比较单向链表,主要有下面几个特点: (1)在数据结构中具有双向指针 (2)插入数据的时候需要考虑前后的方向的操作 (3)同样,删除数据的是有也需要考虑前后方向的操作 那么,一个非循... 阅读全文

posted @ 2014-04-22 15:48 仅此而已_ 阅读(271) 评论(0) 推荐(0)

一步一步写算法(之单向链表) (转)
摘要:有的时候,处于内存中的数据并不是连续的。那么这时候,我们就需要在数据结构中添加一个属性,这个属性会记录下面一个数据的地址。有了这个地址之后,所有的数据就像一条链子一样串起来了,那么这个地址属性就起到了穿线连结的作用。 相比较普通的线性结构,链表结构的优势是什么呢?我们可以总结一下: (1)单个节点... 阅读全文

posted @ 2014-04-22 15:21 仅此而已_ 阅读(192) 评论(0) 推荐(0)

一步一步写算法(之线性堆栈) (转)
摘要:前面我们讲到了队列,今天我们接着讨论另外一种数据结构:堆栈。堆栈几乎是程序设计的命脉,没有堆栈就没有函数调用,当然也就没有软件设计。那么堆栈有什么特殊的属性呢?其实,堆栈的属性主要表现在下面两个方面: (1)堆栈的数据是先入后出 (2)堆栈的长度取决于栈顶的高度 那么,作为连续内存类型的堆栈应该怎... 阅读全文

posted @ 2014-04-22 14:44 仅此而已_ 阅读(186) 评论(0) 推荐(0)

一步一步写算法(之线性循环队列) (转)
摘要:这里的线性结构实际上指的就是连续内存的意思,只不过使用“线性”这个词显得比较专业而已。前面一篇博客介绍了现象结构的处理方法,那么在这个基础之上我们是不是添加一些属性形成一种新的数据结构类型呢?答案是肯定的,队列便是其中的一种。 队列的性质很简单: (1)队列有头部和尾部 (2)队列从尾部压入数据 ... 阅读全文

posted @ 2014-04-22 14:37 仅此而已_ 阅读(447) 评论(0) 推荐(0)

一步一步写算法(之线性结构的处理)(转)
摘要:我们知道,在内存中的空间都是连续的。也就是说,0x00000001下面的地址必然是0x00000002。所以,空间上是不会出现地址的突变的。那什么数据结构类型是连续内部空间呢,其实就是数组,当然也可以是堆。数组有很多优势,它可以在一段连续空间内保存相同类型的数据,并且对这些数据进行管理。所以从这个... 阅读全文

posted @ 2014-04-22 14:18 仅此而已_ 阅读(184) 评论(0) 推荐(0)

一步一步写算法(之堆排序)(转)
摘要:堆排序是另外一种常用的递归排序。因为堆排序有着优秀的排序性能,所以在软件设计中也经常使用。堆排序有着属于自己的特殊性质,和二叉平衡树基本是一致的。打一个比方说,处于大堆中的每一个数据都必须满足这样一个特性: (1)每一个array[n] 不小于array[2*n] (2)每一个array[n]不小于array[2 * n + 1] 构建这样一个堆只是基础,后面我们需要每次从堆的顶部拿掉一个数据,不断调整堆,直到这个数组变成有序数组为主。所以详细的堆排序算法应该是这样的: 1)构建大堆,使得堆中的每一个数据都满足上面提到的性质 2)将堆的第一个数据和堆的最后一个数据进行互换,然后重新调整堆,直. 阅读全文

posted @ 2014-03-12 18:31 仅此而已_ 阅读(180) 评论(0) 推荐(0)

一步一步写算法(之合并排序)(转)
摘要:前面一篇博客提到的快速排序是排序算法中的一种经典算法。和快速排序一样,合并排序是另外一种经常使用的排序算法。那么合并排序算法有什么不同呢?关键之处就体现在这个合并上面。 合并算法的基本步骤如下所示: 1)把0~length-1的数组分成左数组和右数组 2)对左数组和右数组进行迭代排序 3)将左数组和右数组进行合并,那么生成的整个数组就是有序的数据数组 下面就开始实践操作: a)创建函数,判断参数的合法性voidmerge_sort(intarray[],intlength){if(NULL==array||0==length)return;_merge_sort(array,0,length. 阅读全文

posted @ 2014-03-10 16:38 仅此而已_ 阅读(201) 评论(0) 推荐(0)

一步一步写算法(之快速排序)(转)
摘要:快速排序是编程中经常使用到的一种排序方法。可是很多朋友对快速排序有畏难情绪,认为快速排序使用到了递归,是一种非常复杂的程序,其实未必如此。只要我们使用好了方法,就可以自己实现快速排序。 首先,我们复习一下,快速排序的基本步骤是什么: 1、 判断输入参数的合法性 2、把数组的第一个数据作为比较的原点,比该数据小的数据排列在左边,比该数据大的数据排列在右边 3、按照(2)的方法分别对左边的数组和右边的数据进行和(2)一样的数据排列 那么实际编写代码中,应该怎么做呢? a)首先,判断数据的合法性?voidquick_sort(intarray[],intlength){intmedian=0;if. 阅读全文

posted @ 2014-03-07 17:43 仅此而已_ 阅读(211) 评论(0) 推荐(0)

一步一步写算法(之非递归排序)(转)
摘要:在上面一篇博客当中,我们发现普通查找和排序查找的性能差别很大。作为一个100万的数据,如果使用普通的查找方法,那么每一个数据查找平均下来就要几十万次,那么二分法的查找呢,20多次就可以搞定。这中间的差别是非常明显的。既然排序有这么好的效果,那么这篇博客中,我们就对排序算做一个总结。 按照我个人的理解,排序可以分为两种:一种是非递归排序,它主要按照非递归的方法对数据进行排序,也就是说主要数据的移位和循环来完成;另外一种就是递归方法,我们在排列当前数据的时候首先把子数据排列有序,然后才会排列当前的数据。这种不断递归调用的方法就是递归排序。 非递归排序的方法很多,这里主要介绍冒泡排序、插入排序、希. 阅读全文

posted @ 2014-03-07 14:51 仅此而已_ 阅读(202) 评论(0) 推荐(0)

一步一步写算法(之查找)(转)
摘要:无论是数据库,还是普通的ERP系统,查找功能数据处理的一个基本功能。数据查找并不复杂,但是如何实现数据又快又好地查找呢?前人在实践中积累的一些方法,值得我们好好学些一下。我们假定查找的数据唯一存在,数组中没有重复的数据存在。 (1) 普通的数据查找 设想有一个1M的数据,我们如何在里面找到我们想要的那个数据。此时数据本身没有特征,所以我们需要的那个数据可能出现在数组的各个位置,可能在数据的开头位置,也可能在数据的结束位置。这种性质要求我们必须对数据进行遍历之后才能获取到对应的数据。intfind(intarray[],intlength,intvalue){if(NULL==array||.. 阅读全文

posted @ 2014-03-04 19:31 仅此而已_ 阅读(243) 评论(0) 推荐(0)

一步一步写算法(之内存)(转)
摘要:内存是程序运行的基础。所有正在运行的代码都保存在内存里面。内存需要处理各种各样的数据,包括键盘的数据、鼠标的数据、usb的数据、串口的数据、摄像头的数据,那么这些数据经过程序的处理之后,就要进行输出到串口、屏幕、usb等。 内存只有一个,但是程序里面的空间有很多种。但是内存中的数据类型只有几种,... 阅读全文

posted @ 2014-02-28 11:04 仅此而已_ 阅读(149) 评论(0) 推荐(0)

一步一步写算法(之递归和堆栈)(转)
摘要:看过我前面博客的朋友都清楚,函数调用主要依靠ebp和esp的堆栈互动来实现的。那么递归呢,最主要的特色就是函数自己调用自己。如果一个函数调用的是自己本身,那么这个函数就是递归函数。 我们可以看一下普通函数的调用怎么样的。试想如果函数A调用了函数B,函数B又调用了函数C,那么在堆栈中的数据是怎么保存的呢?函数A^函数B|(地址递减)函数C| 如果是递归函数呢,举一个简单的递归函数为例:intiterate(intvalue){if(value==1)return1;returnvalue+iterate(value-1);} 下面我们使用一个函数进行调用,看看会发生什么情况?voidproce. 阅读全文

posted @ 2014-02-28 10:57 仅此而已_ 阅读(437) 评论(0) 推荐(0)

一步一步写算法(开篇)(转)
摘要:算法是计算机的生命。没有算法,就没有软件,计算机也就成了一个冰冷的机器,没有什么实用价值。很多人认为,算法是数学的内容,学起来特别麻烦。我们不能认为这种观点是错误的。但是我们也知道,软件是一种复合的技术,如果一个人只知道算法,但是不能用编程语言很好地实现,那么再优秀的算法也不能发挥作用。一个人只有有了很好的计算机知识和数学知识,才能在算法的学习上不断进步。不管算法都么简单,都要自己亲手实践,只有不断认识错误、不断发现错误,才能不断提高自己的编程能力,不断提高自己的业务水平。 这里取名一步一步写算法的目的主要有两个:第一,保证我们的算法都是大家可以学得会,看的懂的;第二,保证我们的算法是健壮.. 阅读全文

posted @ 2014-02-28 10:41 仅此而已_ 阅读(204) 评论(0) 推荐(0)

一步一步写算法(之循环和递归)(转)
摘要:其实编程的朋友知道,不管学什么语言,循环和递归是两个必须学习的内容。当然,如果循环还好理解一点,那么递归却没有那么简单。我们曾经对递归讳莫如深,但是我想告诉大家的是,递归其实没有那么可怕。所谓的递归就是函数自己调用自己而已,循环本质上也是一种递归。1)求和递归函数 我们可以举一个循环的例子,前面我们说过,如果编写一个1到n的求和函数怎么写呢,你可能会这么写:intcalculate(intm){intcount=0;if(mdata);pNode=pNode->next;}} 那么此时如果改成递归,那就更简单了:voidprint(constNODE*pNode){if(NULL==pN 阅读全文

posted @ 2014-02-28 10:25 仅此而已_ 阅读(242) 评论(0) 推荐(0)

导航