
算法
聚沙塔
这个作者很懒,什么都没留下…
展开
-
选择排序
选择排序(假设递增排序)每次选取从当前结点到末尾结点中最小的一个与当前结点交换,每一轮固定一个元素位置。时间复杂度O(n^2),空间复杂度O(1)。下面的示例代码以带头结点的链表为存储结构:#include#include#define Elemtype doublestruct Node{ Elemtype data; struct Node *next;};void原创 2014-10-10 20:32:26 · 1090 阅读 · 0 评论 -
快速排序
快速排序是基于分治思想的排序,以递增排序为例:首先选取一个基准元素pivot,将小于pivot的元素移到其左侧,大于pivot的元素移到其右侧。这一轮固定了pivot的位置。然后对其左右两侧执行相同的操作。快速排序平均时间复杂度O(nlogn),最差时间复杂度O(n^2);空间复杂度O(1)。示例代码如下:#include#define Elemtype intint原创 2014-10-10 11:05:28 · 1080 阅读 · 0 评论 -
归并排序
归并排序是基于分治思想的排序,一递增排序为例:首先将数组平分为两份,将左侧递增排序,右侧递增排序,然后将两侧归并起来,使整体递增有序。示例代码如下:#include#include#define Elemtype intElemtype *B;void merge(Elemtype A[],int low,int mid,int high){ for(int i=l原创 2014-10-10 11:11:00 · 997 阅读 · 0 评论 -
Kruskal算法
Kruskal算法计算最小生成树,只与边有关,时间复杂度O(eloge)步骤:1.将边按权值递增排序2.依次取出边加入最小生成树中并保证无环,判断是否成环可利用并查集。例:http://ac.jobdu.com/problem.php?pid=1024题目描述:省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达原创 2014-10-01 17:09:50 · 1492 阅读 · 0 评论 -
动态规划:最大连续子序列乘积
题目描述:给定一个浮点数序列(可能有正数、0和负数),求出一个最大的连续子序列乘积。分析:若暴力求解,需要O(n^3)时间,太低效,故使用动态规划。设data[i]:第i个数据,dp[i]:以第i个数结尾的连续子序列最大乘积,若题目要求的是最大连续子序列和,则易确定状态转移方程为:dp[i]=max(data[i],dp[i-1]+data[i])(dp[i]为以第原创 2014-09-30 17:03:19 · 2676 阅读 · 2 评论