
常用算法学习笔记
记录数据结构学习过程中的编写的各种数据结构及算法实现代码,解决学习过程中遇到的问题。
girlkoo
这个作者很懒,什么都没留下…
展开
-
常用排序算法——快速排序法
快速排序法是一种高效的排序法,算法的最终性能取决于选取的中间值,直接实现的快速排序法如下:#include #include static int partition( int* array, int start, int end){ int key = array[start]; int l = start; int r = end; while(l <原创 2013-12-27 10:23:46 · 4127 阅读 · 1 评论 -
常用排序算法——堆排序
堆排序的逻辑非常简单,但是效率较高,代码如下:#include #include class heap {public: heap(int* array, size_t len):arr (array), length(len){ size_t point = (length -1)/2; for(size_t i = 0; i != point;原创 2013-12-27 10:17:19 · 2959 阅读 · 0 评论 -
常用排序算法——归并排序法
归并排序采用的是分治思想,将数组不断分解为子数组,直到子数组只有一个元素,每次分解对应一个归并函数,归并函数可以将当前分解的两个子数组合并起来。有两种方式可以实现归并排序,第一种是递归方式实现的,代码如下:#include static void merge( int* array, int* tmp, size_t start, size_t end){ size_t i = sta原创 2013-12-27 10:11:38 · 3780 阅读 · 0 评论 -
常用排序算法——冒泡、插入、选择
冒泡排序法是初学者最早接触的排序法,实现比较简单,代码如下:#include void bubble_sort(int *array, int len){ for(int i = 1; i != len; ++i){ for(int j = 0; j != len-i; ++j){ if(array[j] > array[j+1]){原创 2013-12-27 10:05:34 · 5132 阅读 · 0 评论 -
交换二叉树的左右子树——非递归方式
这是华为的一道机试题,其实并不难,不让用递归可以用栈来解决,具体的代码如下:#include #include struct node{ char data ; struct node* left ; struct node* right ;};struct tree{ struct node* root ;};void tree_create(原创 2013-12-27 09:31:18 · 13025 阅读 · 0 评论 -
最短路径算法——Floyd
Floyd算法相比Dijkstra算法最大的区别是计算出了任意点起始到任意点的最短路径,算法也不难理解,需要注意的是三层for循环的顺序问题,k必须为最外层循环,具体的代码如下:#include #include #include void shortest_floyd(const std::vector >& graphic, std::vector >& paths){ p原创 2013-12-24 10:29:14 · 3400 阅读 · 0 评论 -
最短路径算法——Dijkstra
Dijkstra的最短路径算法是基于前驱顶点的最短路径计算的,整体上来讲还是比较简单的,下面是代码:#include #include #include void shortestpath( const std::vector >& paths, int from, std::vector& path){ std:: vector flags(paths.size(), fals原创 2013-12-24 10:25:44 · 3794 阅读 · 1 评论 -
最小生成树算法——Kruskal
Kruskal算法的原理是先将图中的所有边按照权从小到大排序,然后循环取边,判断添加上该边后是子图中否有闭合回路,如果没有,则添加该边,否则舍弃该边。直到所有的边都遍历一遍。我认为该算法的核心是排序和判断闭合,判断闭合的原理还没有真正搞明白,不过这种算法很容易记忆,暂且记住!!下面是具体的代码:#include #include #include #include struct原创 2013-12-20 09:49:36 · 3516 阅读 · 1 评论 -
最小生成树算法——Prim
Prim算法是任选一顶点作为起始点,从当前已纳入的顶点与未纳入的顶点间的所有路径中找出权最小的一条进行连接,循环直到所有的顶点都被纳入。代码如下:#include #include #include #include class graphic {public: graphic(int n){ std::cout << "请输入顶点信息" << std::e原创 2013-12-20 09:46:59 · 3443 阅读 · 0 评论 -
栈——中缀表达式转后缀表达式
中缀表达式转后缀表达式的算法较为简单,采用栈来实现。规则如下:遇到数字:直接输出遇到'(':压栈遇到')':持续出栈,如果出栈的符号不是'('则输出,否则终止出栈。遇到符号则判断该符号与栈顶符号的运算优先级,如果栈顶符号的运算优先级高,则出栈并输出,直到优先级相等或栈为空;如果栈顶符号的运算优先级低于或等于当前符号的运算优先级,则将当前符号压栈。处理完字符串后将栈中剩余的符号全部输出。原创 2013-12-20 09:35:35 · 21933 阅读 · 6 评论 -
KMP字符串查找
KMP算法KMP字符串查找算法的目的是减少不必要的比较次数,举个简单的例子,从字符串A:"abcdeabcdfg"中查找字符串B:"abcdf"。使用普通的查找法查找字符串的步骤是这样的:先拿A[0:4]分别与B对应位置的字母比较,如果不相等则拿A[1:5]与B比较,依次类推,直到结束。而KMP算法先分析要朝朝的字符串,以B为例,由于a与后面的四个字节都不相同,而在比较A[0:4]原创 2013-12-20 09:31:53 · 4916 阅读 · 2 评论