
算法
文章平均质量分 65
jun2016425
coolnqjun@163.com
展开
-
二分法查找
二分法查找的实现,以及优化,还有goto的实际的应用原创 2016-08-13 11:14:25 · 360 阅读 · 0 评论 -
二叉树遍历
二叉链表typedef struct Node{ ElemType data; struct Node *lchild, *rchild; }Binode, *Bitree;注意点: 1)已知 前序遍历序列 和 中序遍历序列,可以唯一确定一颗二叉树 2)已知 中序遍历序列和 后序遍历序列,可以唯一确定一颗二叉树 而已知 前序和后序 是不能确定一颗二叉树的二叉树的遍历:原创 2017-05-27 17:25:52 · 436 阅读 · 0 评论 -
任意有根树遍历
左孩子右兄弟的存储方式typedef struct tree_node{ ElemType data; tree_node *left_child; tree_node *right_sibling;} tree_node, *ptree_node;先根遍历 PREORDER(T)if T == NIL return NILprint(T)for p = T.原创 2017-05-31 11:47:06 · 425 阅读 · 0 评论 -
斐波那契数列
斐波那契数列介绍斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(0)=0,F(1)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N原创 2017-09-07 17:57:41 · 617 阅读 · 0 评论 -
统计一个整数的二进制中1的个数.
请实现一个函数,输入一个整数,输出该数的二进制表示中1的个数。 例如把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2.普通解法:int number_of_1(int n){ int count = 0; unsigned int flag = 1; while (flag){ if (n & flag) ++c原创 2017-09-07 22:48:51 · 1829 阅读 · 1 评论 -
求幂函数
完整的题目: 实现函数double Power(double base, int exponent), 求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。C语言代码:#include <stdio.h>#include <stdbool.h>bool g_invalid_input = false;bool equal(double num1, double num2)原创 2017-09-16 12:40:36 · 1121 阅读 · 0 评论 -
删除链表结点O(1)时间
删除链表结点,根据结点的位置,和链表结点数量可分三种情况 1.删除非尾结点,链表的结点数量 >= 2 2.删除只有一个结点的链表,结点数量 == 1 3.删除尾结点,结点数量 >= 2 当然,上面这个3中情况都是已经确定要删除结点在链表中,这个我在delete_node函数内没有做处理,而是把这个问题抛给了delete_node函数的调用者,因为要保证O(1)时间完成删除结点,那么久必须这么原创 2017-09-17 11:52:37 · 449 阅读 · 0 评论 -
快速排序
快速排序简介对于包含n个数的输入数组来说,虽然快速排序是一种最坏情况实际复杂度为Θ(n2)\varTheta(n^2)的排序算法, 但它的平均性能非常好: (1)它的期望时间复杂度是 Θ(nlgn)\varTheta(nlgn) ,而且 (2) Θ(nlgn)\varTheta(nlgn) 中隐含的常数因子非常小. (3) 它还能进行原址排序. 快排目前公认的排序算法里面实际应用中最快的最好的最常原创 2017-03-19 12:57:45 · 427 阅读 · 0 评论 -
快速排序算法C语言
快速排序算法,附带加快理解快速排序算法思想的视频链接,建议先看视频,再看代码原创 2016-07-18 15:53:33 · 634 阅读 · 0 评论 -
旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1.那么如果查找旋转数组的最小数字呢,主要的思想就是二分查找法,即头尾同时查找。 例子查找过程如下: 代码如下:#include <stdio.h>int search_min_rotated原创 2017-09-01 16:40:23 · 277 阅读 · 0 评论 -
字符串匹配KMP算法
字符串匹配,应用主要在文本搜索,DNA序列中搜索特定的序列,搜索引擎查询特定网页地址等。 字符串匹配算法大概有: 1.朴素算法 (如GCC4.8 实现的 strstr 函数) 2.Rabin-Karp 3.有限自动机算法 4.Knuth-Morris-Partt它们的预处理时间和匹配时间如下: 算法 预处理时间 匹配时间 朴素算法 0 O((n−m+1)m)O((n-原创 2017-10-17 12:30:12 · 378 阅读 · 0 评论 -
MD5实现C语言
copy国外网址的代码,只是备份一下,方便查找!注意: 这里写的是要安装环境OpenSSL头文件md5.h/* * This is an OpenSSL-compatible implementation of the RSA Data Security, Inc. * MD5 Message-Digest Algorithm (RFC 1321). * * Homepage: * htt原创 2018-01-03 17:41:38 · 753 阅读 · 0 评论 -
实现对一个含n个元素的单链表的逆转.要去除存储链表本身所需的空间外,该过程只能使用固定大小的存储空间.
这个逆转很简单,流程就是旧单链表从头部删除结点,然后将该结点从新单链表头部插入.设LSRC为原来旧单链表的头部,LDEST为逆转后的链表的头部. REVERSE(LDEST, LSRC)while LSRC.head != NIL x = LSRC.head LSRC.head = x.next x.next = LDEST.next LDEST.head = x原创 2017-05-27 15:24:10 · 369 阅读 · 0 评论 -
链表
链表链表分单向链表,双向链表 下面我看一下双向链表(最常用如图: (图一)双向链表查询查询程序LIST_SEARCH(L,k)找数据为k的元素在L里面,通过一个简单线性查找,返回一个指向这个元素的指针。如果k没有出现在出现在这个列表,则这个程序就会返回空(NIL)。LIST_SEARCH(L, k)x = L.headwhile x != NIL and x.key != k x =原创 2017-05-22 18:32:07 · 591 阅读 · 0 评论 -
从尾到头打印链表
#include // 从尾到头打印链表struct ListNode{ int m_nKey; ListNode* m_pNext;};// 方案一// 将链表放到栈中,再从栈顶逐个输出void PrintListReversingly_Iteratively(ListNode* pHead){ std::stack nodes; ListNode* pNode转载 2016-10-23 18:29:42 · 222 阅读 · 0 评论 -
二分查找
二分查找介绍于已经排好序的数组A进行二分查找。二分查找又可以写成两种子形式(就目前我的水平知道的,日后知道其他再更新吧),一种是递归形式的,一种是迭代的形式。据说所有的递归都可以写成迭代的形式。迭代二分查找伪代码interative_binary_search(A, V, low, high)while low <= high mid = (low + high)/2 i原创 2016-12-31 12:47:29 · 421 阅读 · 0 评论 -
插入排序及插入排序改进
插入排序,在算法导论里面的介绍对数组原创 2016-11-07 00:03:35 · 405 阅读 · 0 评论 -
线性查找
算法导论练习题2.1-3考虑如下查找问题:输入:n个数的一个序列 A = {a1, a2, ..., an} 和一个值 V.输出:下标 i 使得 V = A[ i ] 或者 当 V 不在 A 中出现时,V 为特殊值 NIL.我的线性伪代码如下:n = A.lengthfor i=1 to n if(v==A[i]) return i i = i + 1return原创 2016-12-23 00:27:12 · 752 阅读 · 0 评论 -
选择排序
算法导论中练习题2.2-2考虑排序储存在数组A中的n个数:首先找出A中的最小元素并将其与A[1]中的元素进行交换。接着,找出A中的次小元素将其与A[2]中元素进行交换。对A中前n-1个元素按该方式继续。该算法为选择排序。写出起伪代码英文版(考虑到可能翻译的不到位,所以把英文原文贴上):Consider sorting n numbers stored in array原创 2016-12-25 14:58:18 · 469 阅读 · 0 评论 -
最大子数组问题
最大子数组问题一个数组如: 求解该数组内的一个子数组,该数组的元素属于A[ ],且元素是连续的,且子数组元素的和为A[]内所有子数组中最大的,则该数组为连续数组的最大子数组。暴力求解方法暴力求法,就是一个个的去遍历组合时间 为:T(n)=Θ(n2).T(n) = Θ( n^2 ). 使用分治策略的求解方法但是我们想要更短的时间求解最大子数组问题.那么它就是使用分治策略的求解方法。 使用分治策原创 2017-01-08 19:40:57 · 467 阅读 · 0 评论 -
归并排序
概念归并排序是属于分治算法。 许多有用的算法在结构上是递归的:为了解决一个给定的问题,算法一次或多次递归地调用其自身以解决机密相关的若干子 问题。这些算法典型地遵循分治法的思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题, 然后再合并这些子问题的解来建立原问题的解。 分治模式在递归时都要三个步骤: 分解原问题为若子问题,这些子问题是原问题的规模较小的实例。 解原创 2017-01-19 11:53:43 · 1755 阅读 · 0 评论 -
冒泡排序算法
冒泡排序算法原创 2016-08-04 17:09:42 · 483 阅读 · 0 评论 -
矩阵乘法的Strassen算法
若A=(aij)A=(a_{ij})和B=(bij)B=(b_{ij})是n∗nn*n方阵,则对于i,j=1,2,…,n;定义乘积C = A * B中的元素cijc_{ij}为: cij=∑k=1naikbkjc_{ij}= \sum_{k=1}^{n} a_{ik}b_{kj} 我们需要计算n2n^2个矩阵元素,每个元素是n个值的和。下面过程接收n*n矩阵A和B,返回它们的乘积 n* n矩阵原创 2017-01-13 09:28:35 · 2661 阅读 · 0 评论 -
堆排序
堆排序的时间复杂度是O(nlgn)O(nlgn),堆排序具有空间原址性,任何时候都只需要常数个额外的元素空间存储临时数据。堆的介绍(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树。树上的每一个结点对应数组中的一个元素。除了最底层外,该树是完全充满的,而且从左向右填充。如下图: 表示堆数组A包括两个属性:A.length通常给出数组元素的个数,A.heap-size表示有多少个堆元素存储在该数原创 2017-04-02 23:09:50 · 354 阅读 · 0 评论 -
SHA1实现C语言
因为在我想找sha1加密的时候,没有看到网上可以用的程序,所以就自己找了一下,借用网上大神的例子, 哪个大神具体不记得了。下面是C语言代码:/** If you do not have the ISO standard stdint.h header file, then you* must typdef the following:* name meaning* uint32_t un原创 2017-12-17 14:40:52 · 6048 阅读 · 0 评论