
一些算法
scwMason
一个怀揣梦想的有志青年
展开
-
排序算法————选择排序
选择排序就是对一个A序列中的元素,从A【1】到A【n】进行n趟操作,每趟操作选出待排序的最小值与待排序的第一个元素进行交换,代码如下 void selectSort(){ for (int i = 1; i <= n; i++) { int k = i; for(int j = i; j <= n; j++) { if (arr[j] < arr...原创 2018-04-24 14:58:41 · 177 阅读 · 0 评论 -
欧几里得算法(最大公约数)
求最小公约数公式公式推导请自行搜索,直接套模板:模板一:int gcd(int a, int b){ if (b == 0) return a; return gcd(b, a%b);}模板二:int gcd(int a,int b){ return b ? gcd(b,a%b) : a;}...原创 2019-03-16 09:38:31 · 317 阅读 · 0 评论 -
逆序对的两种解法
题目描述猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计。最近,TOM老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样定义的:对于给定的一段正整数序列,逆序对就是序列中ai>aj且i<j的有序对。知道这概念后,他们就比赛谁先算出给定的一段正整数序列中逆序对的数目。Update:数据已加强。输入输出格式...原创 2019-02-10 23:43:21 · 920 阅读 · 1 评论 -
SPFA--------高效率的图解法
转明出处:http://lib.youkuaiyun.com/article/datastructure/10344SPFA(Shortest Path Faster Algorithm)(队列优化)算法是求单源最短路径的一种算法,它还有一个重要的功能是判负环(在差分约束系统中会得以体现),在Bellman-ford算法的基础上加上一个队列优化,减少了冗余的松弛操作,是一种高效的最短路算法。(spfa会被恶意...原创 2018-07-13 15:16:17 · 854 阅读 · 0 评论 -
Dijkstra---------用堆优化的邻接表版
我们在用没有优化过的版本的时候,里面有一段代码:int u = -1, MIN = INF;for (int j = 0; j < n; j++){ if (vis[j] == false && d[j] < MIN) { u = j; MIN = d[j]; }}这个代码的作用在于寻找所有当前结点能到的结点中距离最短的,也就是这...原创 2018-07-07 13:16:15 · 561 阅读 · 0 评论 -
贪吃蛇小游戏
#include<iostream>#include<vector>#include<windows.h>#include <stdlib.h>#include<time.h>#include <mmsystem.h>#pragma comment(lib, "winmm.lib")#include&原创 2018-07-13 11:32:14 · 184 阅读 · 0 评论 -
Dijkstra--------邻接表版
#include<iostream>#include<vector>#include<algorithm>using namespace std;struct node { int v;//目标结点 int dis;//边权};const int MAXN = 1000;const int INF = 10000000;vector<n...原创 2018-07-06 15:46:18 · 715 阅读 · 1 评论 -
Dijkstra-------------领接矩阵法实现
这是一个单源最短路线算法:寻找所有结点离起点的最短路线距离问题#include<iostream>#include<algorithm>using namespace std;const int MAXN = 1000;const int INF = 10000000;int n, m, s, G[MAXN][MAXN];//n是顶点个数,m是边数,s是起点的编号...原创 2018-07-06 15:16:17 · 414 阅读 · 0 评论 -
排序--------归并排序
这个就是归并算法的思维,其中主要运用了分治算法。归并分为“归”和“并”并:void Bing(int brr[], int left, int mid, int right){ int i = left; int j = mid + 1; int aux[12]; for (int m = left; m <= right; m++)//这里必须要用aux[m-left],因为le...原创 2018-07-05 15:37:39 · 174 阅读 · 0 评论 -
Dijkstra-------多标尺(DFS实现)
#include<iostream>#include<vector>#include<queue>#include<algorithm>using namespace std;const int MAXN = 510;const int INF = 100000000;struct node { int x; int d; nod...原创 2018-07-09 15:54:36 · 178 阅读 · 0 评论 -
Dijkstra---------多标尺问题(Dijkstra解决)
引入问题: 有N个城市(标号为0-N-1),M条道路(无向边)、并且给出M条道路的距离属性和花费属性。现在给定起点s和终点d,求从起点到终点的最短路径及花费。注意:如果有多条最短路径,则选择花费最小的那条 下面是核心算法void Dijkstra(int s){ fill(dis, dis + n, INF); fill(c, c + MAXN, INF); for (i...原创 2018-07-09 15:45:18 · 233 阅读 · 0 评论 -
关于如何使用sort函数排序vector类型的数组
一般情况下有一个 数组arr[10],我们可以这样排序sort(arr,arr+10,cmp);但是,比如arr是一个vector动态数组的话,就不能这样调用了而是要用到begin()函数sort(arr.begin(),arr.begin()+10,cmp);下面是一个例子:// sort algorithm example #include <iostream> // ...原创 2018-06-25 21:49:58 · 3746 阅读 · 0 评论 -
关于sort函数在结构体的应用
sort函数是c++里面的库函数,是快速排序的模板,使用的时候必须加上头文件#include<algorithm>一般的模板是sort(首元素地址,尾元素地址,比较函数)我们这里主要讲在结构体中怎样使用比如说有一个结构体:struct MyStruct{ int sum; int chin; int math; int eng; int num;}ff[s];我们的要求是...原创 2018-06-23 22:03:08 · 1078 阅读 · 1 评论 -
二叉树的遍历
温馨提示:读者一定要了解二叉树的先序、中序、后续遍历方法才能继续往下看哦~~一. 二叉树的储存结构typedef struct node { char date; node* Lchild;//左子树 node* Rchild;//右子树};二. 二叉树的建立先序遍历创建二叉树(递归)node* CreatTree(){ char ch; node* T = new node; c...原创 2018-05-24 18:36:29 · 163 阅读 · 0 评论 -
递归经典问题——N皇后问题
N皇后问题是指在一个N*N的国际象棋棋盘上,有N个棋子,这N个棋子均不在同一行,同一列,同一对角线上,请问一共有几种排列方式? 因为每列都要有棋子,所以只要把每一列的棋子所在的行数排下来就行了,比如第一列到第五列棋子所在的行数依次是24135,然后只要查看每种方法是否满足要求就行了。 void generate(int index)//index是所在的列数{ bool fla...原创 2018-04-27 18:37:14 · 301 阅读 · 0 评论 -
字典树的入门
所谓字典树,就是将一些单词利用树状图储存起来,然后可以进行一些快速的查找等功能上图是一棵 Trie 树,表示了关键字集合{“a”, “to”, “tea”, “ted”, “ten”, “i”, “in”, “inn”} 。从上图可以归纳出Trie树的基本性质:根节点不包含字符,...原创 2018-04-20 18:01:46 · 302 阅读 · 0 评论 -
散列(一)
我们先来看一个问题: 给出n个整数,再给出m个整数,请问这m个整数在n个整数中是否出现过,你可能会想将每个数字一个一个查找一边就好了,但是这样的话时间复杂度会很高O(nm),那么这里我们就可以用空间换时间: 我们创建一个数组hashTable[x],初始化为false,在输入n个整数的时候将每个对应hashTable[x]改为true,然后在输入m个数字的时候看看每个数字在hashTa...原创 2018-04-24 16:50:34 · 291 阅读 · 0 评论 -
排序算法——快速排序
从图中我们可以看到:left指针,right指针,base参照数。其实思想是蛮简单的,就是通过第一遍的遍历(让left和right指针重合)来找到数组的切割点。第一步:首先我们从数组的left位置取出该数(20)作为基准(base)参照物。第二步:从数组的right位置向前找,一直找到比(base)小的数, ...原创 2018-04-24 15:04:56 · 223 阅读 · 0 评论 -
数论--负进制转换
首先需要明白正进制的转换,比如7转换成二进制,那么7/2=3余1,3/2=1余1,1/2=1余0,所以7的二进制就是倒着写余数0111那么如果-7转换成-2进制呢,因为-7/-2=3余-1,所以我们这个-1没法处理,所以我们需要一个看起来很简单但是想不到的转换公式:(商+1)*除数+(余数-除数)=商*除数+除数+余数-除数=商*除数+余数=被除数也就是我们当-7/-2=...原创 2019-08-19 19:45:53 · 515 阅读 · 0 评论