算法设计
杰Tang_fighting
这个作者很懒,什么都没留下…
展开
-
加油站问题
前几天,一个本科同学(准备参加浙大研究生复试)在群里说被加油站问题搞晕了。于是我就去网上查了一下这个问题,并在别人的基础上解决了这个问题。转载的加油站问题:描述一辆汽车加满油后可行驶n公里。旅途中有若干个加油站。设计一个有效算法,指出应在哪些加油站停靠加油,使沿途加油次数最少。对于给定的n和k(k Input有多个测试用例。每个测试用例输入数据的第一行有2 个正整数n和原创 2014-03-13 21:05:10 · 1207 阅读 · 0 评论 -
插入排序和希尔(Shell)排序
【插入排序】数组前k-1个元素已经有序,如何确定第k个元素的插入位置,使得这k个元素有序。方法1:从左到右扫描扫描这个有序子数组,直到遇到第一个大于等于A[k]的元素,然后把A[k]插在这个元素的前面。方法2:从右到左扫描这个有序子数组,直到遇到第一个小于等于A[k]的元素,然后把A[k]插在这个元素的后面。【希尔排序】先将数组分组,分别对每组进行插入排序,依次减少分组数进行插原创 2014-04-27 22:17:09 · 815 阅读 · 0 评论 -
二分查找
【二分查找】针对有序数组,性能非常好。【时间复杂度】logn【代码】#include #include //非递归实现二分查找int BinarySearch1(int a[], int n, int key){ int left, right; int mid; left = 0; right = n - 1; while(left <= right)原创 2014-04-27 14:45:49 · 779 阅读 · 0 评论 -
并查集(Union-Find)算法介绍
点击打开链接转载 2014-05-12 14:52:06 · 410 阅读 · 0 评论 -
Kruskal算法的C语言实现(并查集版)
【问题】Kruskal算法求加权连通图的最小生成树的算法。kruskal算法总共选择n- 1条边,所使用的贪婪准则是:从剩下的边中选择一条不会产生环路的具有最小耗费的边加入已选择的边的集合中。注意到所选取的边若产生环路则不可能形成一棵生成树。kruskal算法分e 步,其中e 是网络中边的数目。按耗费递增的顺序来考虑这e 条边,每次考虑一条边。当考虑某条边时,若将其加入到已选边的集合中会出原创 2014-05-12 17:40:18 · 3182 阅读 · 0 评论 -
最小生成树-Prim算法
【问题】求一个给定的加权连通图的最小生成树问题。【代码】#include #include #define MAXNUM 1000#define MAX_VERTEX_NUM 20typedef char Vertextype;typedef struct node { int weight;}Adjmatrix[MAX_VERTEX_NUM][MAX_VERT原创 2014-05-11 17:22:19 · 756 阅读 · 0 评论 -
快速排序
【快速排序】【算法】分治法【时间复杂度】nlogn【代码】#include #include //挖坑填数void QuickSort1(int a[], int left, int right){ if(left < right) { int i, j; int tmp; tmp = a[left]; i = left; j = righ原创 2014-04-25 19:43:30 · 738 阅读 · 0 评论 -
查找以指定字符开始和结尾的子串数量
【算法设计与分析基础3.2-9】在一段给定的文本中查找以A开始,以B结尾的子串的数量(例如,在CABAAXBYA中有4个这样的子串)。【算法】以字符‘B’结尾的子串的个数等于字符‘B'左侧字符串中‘A’的数量。如:C A B A A X B Y A 1 2以第一个‘B’为结尾的子串个数为左侧’A‘的个数,故只有一个子串:AB。C A原创 2014-04-24 20:18:21 · 3884 阅读 · 0 评论 -
合并排序
【合并排序】【算法】分治法的典型应用。对于一个需要排序的数组A[0..n-1],先把它一分为二:A[0..[n/2]-1]和A[[n/2]..n-1],对子数组递归排序,然后把这两个排好序的子数组合并为一个有序数组。优点:最坏情况下时间复杂度为:nlogn -n+1缺点:需要线性的额外空间。【时间复杂度】平均复杂度nlogn【代码】#include #includ原创 2014-04-24 22:35:18 · 729 阅读 · 0 评论 -
荷兰国旗问题
【算法设计与分析基础4.2-9】荷兰国旗问题要求对字符R、W和B构成的任意数组排序(红、白和蓝是荷兰国旗的颜色),使得所有R排在最前面,W随后,B在最后。为该问题设计一个线性效率的在位算法。【算法】假设数组的状态如下A[0] ... A[r-1] A[r] ... A[w -1] A[w] ... A[b] A[b+1] ... A[n -1] 全部填R原创 2014-04-25 20:54:01 · 2920 阅读 · 0 评论 -
选择排序和冒泡排序
【选择排序和冒泡排序】【算法】蛮力法选择排序,第一次扫描整个数组,找到最小元素,然后和第一个元素交换。第二次从第二个元素开始扫描数组,找到剩下的元素中最小的与第二个元素交换位置,直到最后。| 89 45 68 90 29 34 17 17 | 45 68 90 29 34 89 17 29 | 68 90 45 34 89 17原创 2014-04-24 22:54:50 · 652 阅读 · 0 评论 -
堆和堆排序
堆是一种灵巧的、部分有序的数据结构,它尤其适合用来实现优先队列。优先队列是元素的一个集合,其中每个元素都包含一个被称为元素优先级的可排序属性。优先队列支持下面的操作:找出一个具有最高优先级的元素(即最大元素);删除一个具有最高优先级的元素;添加一个元素到集合中。通过采用堆这种数据结构可以高效实现这些操作。下文分两部分:第一部分介绍堆;第二部分讲解堆排序。【第一部分:原创 2014-04-16 16:11:35 · 2170 阅读 · 0 评论 -
约瑟夫环问题(Josephus)
【问题描述】 约瑟夫环问题(Josephus) 用户输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出。写出C程序。(约瑟夫环问题 Josephus)【解题思路】构建一个循环链表,每个结点的编号为1,2,......,n。每次从当前位置向前移动m-1步,然后删除这个结点。【C程序代码】#include #include type原创 2014-05-06 10:50:36 · 988 阅读 · 0 评论 -
算法中重要的问题类型
计算中能遇到无数种问题,dan1.排序原创 2014-04-16 22:20:12 · 1307 阅读 · 0 评论 -
非递归实现树的遍历
【代码】#include #include using namespace std;typedef struct Node{ char key; struct Node *lchild, *rchild;}*Tree, TNode;void PreOrder(Tree T) //先序遍历{ if (T == NULL) return; TNode *curr = T原创 2014-10-08 15:19:53 · 742 阅读 · 0 评论