data structure & algorithm
shallnet
一个没赶上脑残一代90后的80后程序猿!
展开
-
取单链表倒数第k个元素
算法基本思想从头至尾遍历单链表,并用指针P指向当前节点的前K个节点。当遍历到链表的最后一个节点时,指针P所指向的节点即为所查找的节点。 3. 详细实现步骤增加两个指针变量和一个整型变量,从链表头向后遍历,其中指针P1指向当前遍历的节点,指针P指向P1所指向节点的前K个节点,如果P1之前没有K个节点,那么P指向表头节点。用整型变量i表示当前遍历了多少节点,当i>k时,指针p随着每次遍历,也向前移动一个节点。当遍历完成时,p或者指向表头就节点,或者指向链表中倒数第K个位置上的节点。原创 2012-01-09 09:52:59 · 1311 阅读 · 0 评论 -
链栈的实现
1. 声明结构体的方式有两种:一种是在结构定义的后面加上一个或多个变量名,如下所示:struct s1{ int x; int y;}first,second;另一种方法是将定义和声明分开。如下:struct s1{ int x; int y;};struct s1 first ,second;2.原创 2010-02-18 23:07:00 · 1344 阅读 · 0 评论 -
循环队列的实现
在队列中也可以使用连续的内存空间存放队列元素,附设两个指针分别指向对头和队尾,初始化两个指针为0,当有元素进队时对为指针加1,有元素出对时队尾指针加1。但这样的话会有问题,就是出队列留下的地址空间就不会被利用了,且当开始分配的空间使用完时还会不停的申请空间,浪费了很对空间。若固定的空间的话队尾指针到了末尾就无法在添加元素了,而此时出队列留下的地址处还有空间无法使用。一个较好的办法是将对列构想成一个原创 2010-03-14 22:44:00 · 3267 阅读 · 0 评论 -
链式队列的实现
队列是一种先进先出的线性表,也是一种操作受限的线性表,只允许在表的头部删除元素和尾部添加元素。队列有链式表示和顺序表示。队列的链式表示由于在表头和表尾操作,需要两个指针分别指向对头和队尾。空的链式队列判决条件为对头指针和队尾指针是否指向同一个结点(头节点)。链式队列的存储结构#define OK 1#define NULL_QUEUE 0#define ERROR原创 2010-03-06 20:09:00 · 1314 阅读 · 0 评论 -
线性表链式实现
上一节说到线性表的顺序实现,顺序表示是使用一段连续的内存空间存储表元素,这使得存取数据元素相当快,直接使用下标即可存取元素,但这种线性表表示方式的缺点就是在插入和删除元素是要移动数据元素,移动元素多少并且是和线性表的长度相关的,当表很长时插入删除元素要移动相当大量的数据。这一节将要说到线性表的另外一种存储方式——链式存储方式,这种方式不需要线性表元素在物理上相邻,插入和删除不需要移动元素,但也没有顺序存储的随机存储的优点。原创 2010-02-07 23:35:00 · 3029 阅读 · 0 评论 -
线性表顺序实现
线性表的顺序表示是指用一组连续的内存地址单元存储线性表数据。线性表的这种存储结构容易实现随机存取第i个数据元素以及求线性表的长度。原创 2010-02-07 23:34:00 · 1324 阅读 · 0 评论 -
算法开篇
算法广义上是指“计算机领域的对问题的思考方式以及解决步骤,是一种思路和逻辑性的体现”。还有大家都知道的一句话:算法是程序的灵魂。原创 2010-02-07 23:28:00 · 1110 阅读 · 0 评论 -
排序算法之总结
前面几节讲了几种排序算法(包括算法思想、算法实现、算法分析),本节将要对这几种算法进行一个综合比较分析,大致有如下结果:排序算法平均时间最坏情况稳定性辅助存储直接插入排序 O(n2) O(n2) 稳定 O(1) Shell排序O(nlogn)O(ns) 1<s<2不稳定O(1)冒泡排序 O(n原创 2012-01-05 11:23:15 · 964 阅读 · 0 评论 -
排序算法之交换排序
(1) 冒泡排序思想:第一趟排序:首先将第一个记录的关键字和第二个记录的关键字比较,若为逆序,则将两个记录交换之,然后比较第二个和第三个的关键字。以此类推,直至第n-1个记录和第n个记录关键字比较为止。该过程为第一趟排序,使得最大的关键字排到了最后面。第二趟排序:对前n-1个记录进行相同操作,完成后使得次大的关键字排在n-1位置上。以此类推,进行第三、四次排序直到排序结束。判断排序结束条件是:在一趟排序过程中没有发生过交换记录的操作。一般第i趟排序是从第1个元素到(n-i+1)个记录依次比较相邻两原创 2011-12-06 09:31:11 · 1274 阅读 · 0 评论 -
排序算法之插入排序
本节主要分析插入排序算法的直接插入排序和希尔(shell)排序(又称缩小增量排序)。1. 直接插入排序 该排序是最简单的排序方法,其基本思想是:假设待排序的记录存放在数组R[1..n]中。初始时,R[1]自成1个有序区,无序区为R[2..n]。从i=2起直至i=n为止,依次将R[i]插入当前的有序区R[1..i-1]中,生成含n个记录的有序区。直接插入排序算法:[cpp] view plaincopy01.void insert_sort(sqlist *原创 2011-12-06 09:19:22 · 1684 阅读 · 0 评论 -
二叉树遍历非递归实现
遍历是二叉树各种操作的基础,上一节给出的遍历算法是递归实现的,本节给出二叉树遍历的非递归实现,非递归实现需要使用前面讲到的数据结构——栈、队列来作为辅助空间原创 2010-03-24 11:42:00 · 2343 阅读 · 2 评论 -
二叉树的线索化
前面说到二叉树的二叉链表表示实现,当以二叉树作为存储结构时,只能找到节点的左右孩子信息,不能直接得到结点在任一序列中的前驱和后继信息,只有在遍历过程中才能得到这种信息。我们知道,在n个结点的二叉链表栈必定存在n+1个空链域,因此,可以利用这些空链域来存放这些结点信息。所以作如下规定:若结点右左子树,则其lchild域指向其左孩子,否则令lchild域指向其前驱;若结点有右子树,其rchild域指向其右孩子,否则指向其后继。以这种结构构成的二叉链表叫做线索链表。原创 2012-01-14 10:34:56 · 6121 阅读 · 1 评论 -
排序算法之归并排序
归并排序(Merge Sort)是利用"归并"技术来进行排序。归并是指将若干个已排序的子文件合并成一个有序的文件。1. 归并排序思想初始序列为n个记录,可看成n个有序的子序列,每个序列长度为1,然后两辆归并,直到得到n/2或n.2+1个长度为2或1的子序列,再两两归并,······,如此重复,直到得到一个长度为n的有序序列为止。这种排序称为2-路归并排序。算法三步骤:原创 2011-12-20 09:12:37 · 1025 阅读 · 0 评论 -
二叉树的二叉链表表示与实现
前面几节讲到的结构都是一种线性的数据结构,今天要说到另外一种数据结构——树,其中二叉树最为常用。二叉树的特点是每个结点至多只有两棵子树,且二叉树有左右字子树之分,次序不能任意颠倒。二叉树的存储结构可以用顺序存储和链式存储来存储。二叉树的顺序存储结构由一组连续的存储单元依次从上到下,从左到右存储完全二叉树的结点元素。对于一般二叉树,应将其与完全二叉树对应,然后给每个结点从1到i编上号,依次存储在大小为i-1的数组中。这种方法只适用于完全二叉树,对非完全二叉树会浪费较多空间,最坏情况一个深度为k的二叉树只有k原创 2010-03-15 14:03:00 · 5602 阅读 · 2 评论 -
循环左移数组
1. 算法要求设将n(n>1)个整数存放到一维数组R中,试设计一个在时间和空间两方面尽可能有效的算法,将R中保有的序列循环左移P(0﹤P﹤n)个位置,即将R中的数据由(X0 X1 ……Xn-1)变换为(Xp Xp+1 ……Xn-1 X0 X1 ……Xp-1)。2. 算法思想原创 2012-01-09 09:55:50 · 1837 阅读 · 0 评论 -
排序算法之选择排序
选择排序(Selection Sort)的基本思想是:每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕。常用的选择排序方法有简单选择排序(Simple Selection Sort)和堆排序(Heap Sort)。原创 2011-12-20 09:10:36 · 1110 阅读 · 0 评论 -
排序算法之概述
排序是计算机程序设计中的一种重要操作。所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来。其确切定义如下: 输入:n个记录R1,R2,…,Rn,其相应的关键字分别为K1,K2,…,Kn。 输出:Ril,Ri2,…,Rin,使得Ki1≤Ki2≤…≤Kin。(或Ki1≥Ki2≥…≥Kin)。1.被排序对象--文件 被排序的对象--文件由一组记录组成。 记录则由若干个数据项(或域)组成。其中有一项可用来标识一个记录,称为关键字项。该数据项的值称为关键字(Key)。2.排序原创 2011-11-17 09:01:18 · 944 阅读 · 0 评论 -
顺序栈的实现
其实栈也是线性表,只是其为操作有限制的线性表,栈的插入和删除被限制为只能在表尾进行。栈也有两种表示方式:顺序表示和链式表示。栈的基本操作除了在栈顶进行插入、删除之外还有栈的初始化、栈顶元素等操作。顺序栈使用一组连续的内存空间存放数据,附设两个指针分别指向栈顶和栈底,通过栈顶和栈底是否相等可判断栈是否为空。原创 2010-02-15 22:50:00 · 1619 阅读 · 0 评论