探讨排序算法的实现
摘要:排序算法是我们工作中使用最普遍的算法,常见的语言库中基本都会有排序算法的实现,比如c标准库的qsort,stl的sort函数等。本文首先介绍直接插入排序,归并排序,堆排序,快速排序和基数排序等比较排序算法,然后介绍计数排序,基数排序等具有线性时间的排序算法。本文主要讨论算法的实现方法,并不会过多介绍...
阅读全文
posted @
2014-06-07 16:42
coderkian
阅读(929)
推荐(0)
递归算法转换为非递归算法的技巧
摘要:递归函数具有很好的可读性和可维护性,但是大部分情况下程序效率不如非递归函数,所以在程序设计中一般喜欢先用递归解决问题,在保证方法正确的前提下再转换为非递归函数以提高效率。函数调用时,需要在栈中分配新的帧,将返回地址,调用参数和局部变量入栈。所以递归调用越深,占用的栈空间越多。如果层数过深,肯定会导致...
阅读全文
posted @
2014-05-28 23:20
coderkian
阅读(21951)
推荐(12)
josephus问题
摘要:问题描述n个人围成一圈,号码为1-n,从1开始报数,报到2的退出,剩下的继续从1开始报数,求最后一个人的号码。算法分析最直观的算法是用循环链表模拟。从首节点开始,不断删除第二个节点,直到只剩一个节点为止。时间复杂度是O(2n).typedef struct josephusnode{ struct josephusnode *next; int item;}jnode;int listjosephus(jnode *head){ jnode *n = head; while(n->next!=n){ jnode *t = n->next; n...
阅读全文
posted @
2014-03-09 14:33
coderkian
阅读(308)
推荐(0)
几种判断点与多边形关系的算法介绍
摘要:本文讨论如何判断一个点是在多边形内部,边上还是在外部。为了方便,这里的多边形默认为有向多边形,规定沿多边形的正向,边的左侧为多边形的内侧域,即多边形边按逆时针方向遍历,不考虑自交等复杂情况。比较常见的判断点与多边形关系的算法有射线法、面积法、点线判断法和弧长法等,算法复杂度都为O(n),不过只有射线法可以正确用于凹多边形,其他3个只可以用于凸多边形。1. 射线法射线法是使用最广泛的算法,这是由于相比较其他算法而言,它不但可以正确使用在凹多边形上,而且不需要考虑精度误差问题。该算法思想是从点出发向右水平做一条射线,计算该射线与多边形的边的相交点个数,当点不在多边形边上时,如果是奇数,那么点就一定
阅读全文
posted @
2014-01-29 00:02
coderkian
阅读(10341)
推荐(1)
闲聊叉积在计算几何中一些作用
摘要:定义两个向量的叉积写作a×b,可以定义为a×b=absinθn其中θ表示a和b之间的角度(0°≤θ≤180°)。它位于这两个矢量所定义的平面上。而n是一个与a、b所在平面均垂直的单位矢量。矢量叉积是计算几何算法的核心部分,具有重要的几何意义。一、计算多边形面积设多边形有n个顶点V0(X0,Y0), V1(X1,Y1)... Vn-1(Xn-1, Yn-1),从原点O(0,0)与每条边做三角形,计算的面积和就是多边形面积。三角形面积可以用叉积计算,比如OV0V1面积为:S0=0.5*OV0×OV1=0.5*(X0Y1-X1Y0)于是多边形面积总和
阅读全文
posted @
2014-01-28 00:55
coderkian
阅读(2476)
推荐(0)
递归与非递归算法求序列所有排列组合
摘要:问题描述:给定已知序列A1A2…An,求出其所有排列组合一、递归算法基本思路:1. 如果n等于1,输出当前序列2. 否则依次交换Ai(i=1,2..n-1,n)和An3. 对于前n-1长度序列,重复1、2两步算法复杂度O(n!),算法缺点:如果序列中有重复字符,会出现相同排列组合。递归算法效率低。算法优点:可以应用于所有字符串序列二、非递归算法基本思路:1. 假设字符都是可比较的,每种排列组合之间都可以比较大小,A1A2…An的最小排列是P1P2…Pn(P1,p2..pn是非严格递增的)。2. 从P1P2…Pn开始找出刚好比当前排列大的排列。3. 循环第2步,直到得到最大的排列Pn…P2p1,
阅读全文
posted @
2013-11-05 23:21
coderkian
阅读(2413)
推荐(0)