算法
KangRoger
这个作者很懒,什么都没留下…
展开
-
排序算法之插入排序
插入排序算法就像我们平时打扑克时,在发牌时整理牌得过程:当拿到一张新牌时,从右到左比较,直到找到一张不小于这张牌为止(假设是升序排序),之后把牌插入到这个位置。 假设要对数组A中的元素进行插入排序,则升序排序的伪代码如下:for j->2 to length[A] do key<-A[j] i<-j-1 while i>0 and a[i]>key do a[i+1]<原创 2012-08-23 20:03:09 · 1182 阅读 · 1 评论 -
二叉树的非递归遍历以及层次遍历
在递归调用过程用,原创 2014-08-06 12:38:41 · 1292 阅读 · 0 评论 -
数据结构之二叉查找树
二叉查找树是按二叉树的结构来组织的,如下图所示。每个结点都是一个对象;结点中除了数据key外,还有三个指针p,left,right,分别指向父结点,左儿子,右儿子。二叉查找树总是满足一下性质:x是二叉查找树中的一个结点。如果y是x左子树的一个节点,则key[y]=key[x]。根据二叉查找树的性质,可以用一个递归算法按排列顺序输出所有关键字:中序遍历。//中序遍历INO原创 2013-04-15 20:52:25 · 2218 阅读 · 0 评论 -
图的概念和关于图的几个算法
图是算法中是树的拓展,树是从上xian原创 2014-07-19 17:07:13 · 5717 阅读 · 0 评论 -
最少硬币找零问题-动态规划
动态规划把问题分为子为题原创 2014-06-30 21:15:22 · 37110 阅读 · 11 评论 -
排序算法之快速排序
快速排序是原地排序,其最坏运行时间为O(n^2),但是其期望运行时间为O(nlgn)。快速排序是一种递归调用,其原理为:在排序的数组中选择一个关键字key=A[i],然后将数组划分为两组A[1,2...p-1],A[p+1,......q],其中A[p]=key。之后再对A[1,2...p-1],A[p+1,......q]递归调用。实现过程1(升序) 下面实现是1从右向左找小于关键字原创 2013-04-01 22:16:00 · 794 阅读 · 0 评论 -
堆排序
堆又叫二叉堆,是一种常用的数据结构。在实现中,有最大堆和最小堆两种。最小堆常常用于优先队列,堆也可以用于排序。以最小堆为例:最小堆中,一个结点的值不大于它的孩子。 1 / \ 2 3 / \ / \ 4 5 6 7 / \ / 8 9 10 可以用数组实现堆原创 2014-07-17 22:25:02 · 1176 阅读 · 0 评论 -
二叉树最近公共父节点
找二叉树的最近公共父结点。有父结点指针时,容易找。没有父结点指针时,一种算法时间复杂度为O(N^2),一种算法时间复杂度为O(N)。原创 2014-10-24 16:45:41 · 9664 阅读 · 0 评论 -
字符串循环移位
字符串循环移位。时间复杂度和空间复杂度都为O(1),三种方法。原创 2014-10-27 18:27:03 · 4911 阅读 · 0 评论 -
中缀表达式转后缀表达式
中缀表达式转后缀表达式原创 2014-11-03 19:35:36 · 3127 阅读 · 1 评论 -
二叉树的线索化
当二叉树使用链表表示时,用左右两个孩子指针可以找到左右孩子信息。我们可以用先序、中序、后序遍历二叉树,不同的遍历得到不同排列顺序的结点信息。只有在遍历的过程中才能得到某一结点的前驱与后继结点。在n个结点的二叉树中,有2n个指针域,根节点不用指针域,其他(n-1)个结点只用了(n-1)个指针域,还有(n+1)个指针域空着没用,我们可以利用者空着的指针域来记录某种遍历下结点的前驱与后继。为了区分某原创 2014-08-08 10:04:39 · 2786 阅读 · 0 评论 -
洗牌算法Fisher–Yates shuffle
一个扑克牌洗牌的算法,算法复杂度为O(N)。原创 2014-09-24 16:55:41 · 9607 阅读 · 0 评论 -
单链表反转(递归和非递归)
单链表反转有递归和非递归两种算法。下面定义节点typedef struct ListNode{ int value; ListNode* next;}ListNode;在递归算法中的做法是:1找到最后一个节点和倒数第二个节点2反转这两个节点3倒数第三个和第四个节点重复执行步骤2代码如下:void Inversion_Recursion(ListNode* p,原创 2014-03-02 10:53:21 · 24728 阅读 · 5 评论 -
二叉树的递归遍历(先序、中序、后序)
二叉树是常用的数据结构,一个变形就是二叉查找树。二叉树有点像堆,如果二叉树是满二叉树,可以像堆一样用数组表示,否则就很浪费内存。二叉树常用链式表示原创 2014-08-06 10:44:34 · 1748 阅读 · 0 评论 -
排序算法之合并排序
合并排序属于分治算法。分治算法的思想是:把原来的问题分解成n个较小规模的问题,较小规模的问题与原问题相似,之后递归的解决这n个问题,最后把n个问题合并就可以得到原来问题的解。合并排序的思想是:假设要排序数组A,那么把数组A分成两个子数组A1和A2,排序A1和A2,之后把A1和A2合并即可把A排序。其中排序A1和A2是子问题,可以把子问题再分解、合并排序解决子问题……。直到子问题分解为数组中只有原创 2012-10-09 08:51:50 · 1122 阅读 · 0 评论 -
排序算法之计数排序
在排序算法中,有的是基于“比较”来排序的,比如:冒泡、插入、堆排序、快速排序等,这些排序都是通过比较两个数的大小来移动或交换位置。所以这些算法中,最坏情况时间复杂度为O(n^2),有的算法比较高效,它们时间复杂度的下界为O(nlgn)。有的排序算法不是基于“比较”来排序的,那么它们的时间复杂度的下界可以小于O(nlgn)。计数排序就是其中一个。计数排序的思想是:找出数组A中,小于A[j]数原创 2013-04-05 15:41:18 · 857 阅读 · 0 评论 -
排序算法之基数排序
基数排序是一种非比较型排序算法。它是通过依次对一个数的每一位来排序,最终来达到排序的目的。比如数:73,22,93,43,55,14,28,65,39,81对最低位排序后为:81,22,73,93,14,55,65,28,39再对十位排序后:14 22 28 39 43 55 65 73 81 91假设要排序的数中最大的数有d位,那么排序方法为RADIX-SORT(A, d)原创 2013-04-08 10:10:06 · 861 阅读 · 0 评论 -
数据结构之二叉堆
二叉堆数据结构是一个数组对象,可以将它看做一个二叉树;如下图所示。树的根是A[1],对应节点下标k,其父亲、左孩子、右孩子下标可以直接计算得到--------------------------------------------------------------------------------------------------------Parent(k) ret原创 2013-03-25 21:36:42 · 1269 阅读 · 0 评论 -
排序算法之希尔排序
希尔排序的思想是根据步长d将排序的数组分成d组,a[0],a[0+d].....为一组,a[1],a[1+d]...为一组,把每组用插入排序进行排序,这时每个数都朝着最终位置的方向移动一大步。逐渐缩小d,直至d=1(最后一个步长必须为1),此时的排序为插入排序,但此时数组已经基本有序,因此插入排序较快。算法复杂度与步长有关,已知最好的: #include #include u原创 2013-03-24 20:39:53 · 1007 阅读 · 0 评论 -
判断数组中是否有主元素
在网上看到的多益网络的一道笔试题目。大意如下:原创 2014-05-10 16:02:45 · 3607 阅读 · 1 评论 -
Trie树
Trie树又叫字典树、前缀树,原创 2014-07-15 21:31:41 · 1190 阅读 · 0 评论 -
希尔排序
#include#includeusing namespace std;void print(vector& v){ for(int i=0;i<v.size();i++) cout<<v[i]<<" "; cout<<endl;}void shellSort(vector &v){ for(int gap=v.size()/2;gap>0;gap=gap/2) {原创 2014-07-17 22:24:10 · 1069 阅读 · 0 评论 -
单向链表是否有交点以及查找交点
两个单向链表,如果有交点,那么它们最后的一个结点必定相同。原创 2014-06-29 10:25:25 · 1814 阅读 · 1 评论 -
单向链表之C++实现
单向链表是常用的数据结构,之前只是看过,没有自己动手实现过,现在来原创 2014-07-01 21:20:40 · 9823 阅读 · 0 评论 -
先序遍历+中序遍历求二叉树
二叉树的遍历分为前序遍历、zhongxu原创 2014-07-02 20:50:08 · 2340 阅读 · 0 评论 -
排序算法之选择排序
选择排序是:选出A中最小的与A[1]进行交换(假设是升序),再选择次小的与A[2]交换,对A进行n-1次这样的过程。算法伪代码如下:for i-> to 1 length[A]-1 do key<-a[i] j<-i+1 n<-j while j<= length[A] if key>A[j] do key=A[j] n=j do j<-j+1原创 2012-08-30 19:43:12 · 850 阅读 · 0 评论