算法
文章平均质量分 92
算法分析与设计 算法实践的笔记与例子
李不难
咸鱼一只,有错误请指正,谢谢(*°∀°)=3
展开
-
二叉树遍历递归、非递归
\二叉树代码、建树void BTree::buildTree(vector<int>&a)//创建{ if (a.size() == 0) { return; } root = new TreeNode(a[0]); for (int i = 1; i < a.size(); i++) { TreeNode *newNode = new TreeNode(a[i]); TreeNode *node = root; while (node) {原创 2020-12-19 16:33:48 · 85 阅读 · 1 评论 -
归并、快排、堆排序
优化void fall(vector&arr, int heapSize, int fallIndex){int l = fallIndex * 2 + 1;int r = fallIndex * 2 + 2;if (r < heapSize)//右节点的序号小于数组大小{int maxChild = arr[l] > arr[r] ? l : r;if (arr[fallIndex] < arr[maxChild]){swap(arr[fallIndex]..原创 2020-12-15 17:08:25 · 66 阅读 · 0 评论 -
桶排序
桶排序适用于均匀的数据排列桶排序主要三步1.建桶2.排序3.还原void sort_bucket(vector<int>&arr, int bucketNum) { int maxN = max(arr, 0, arr.size()); int minN = min(arr, 0, arr.size()); int everyNum = ((maxN - minN + 1) / bucketNum) + 1; vector<vector<int&g原创 2020-12-11 20:11:03 · 121 阅读 · 0 评论 -
排序算法(选择、计数、冒泡、插入、希尔排序)
void sort_selection(vector<int>&arr)//选择{ for (int j = 0; j < arr.size() - 1; j++) { int maxpos = j; for (int i = j + 1; i < arr.size(); i++) { if (arr[i] > arr[maxpos]) { maxpos = i; } } swap(arr[j], arr[maxpos原创 2020-12-10 22:11:43 · 67 阅读 · 0 评论 -
阶乘之和(算法竞赛入门)
输入n,计算S=1!+2!+3!+…+n!的末6位(不含前导0)。n≤106,n!表示 前n个正整数之积。样例输入: 10样例输出: 37913这个任务并不难,引入累加变量S之后,核心算法只有“for(int i=1;i<=n;i++)S +=i!”。不过,C语言并没有阶乘运算符,所以这句话只是伪代码,而不是真正的代码。 事实上,还需要一次循环来计算i!,即“for(int j=1;j<=i;j++)factorial*=j;”。代码如下:#include<stdio.h> int m原创 2020-07-16 16:31:23 · 2794 阅读 · 1 评论 -
近似计算(算法竞赛入门)
看算法书,偶然看到这个,觉得当初学校上课时候做过,当初觉得很难,现在也没一下就能想出解法,还是需要多加练习,放假惰性太强,害,慢慢打卡!重复计算,因此可以用循环实现。但不同的是,只有算完一项之后才知道它是否小于10-6。也就是说,循环终止判断是在计算之后,而不是计算之前。 这样的情况很适合使用do-while循环。代码: #include<stdio.h> int main() { double sum = 0; for(int i = 0; ; i++) { d.原创 2020-07-16 16:17:33 · 1275 阅读 · 0 评论 -
三位数反转(算法竞赛入门)
输入一个三位数,分离出它的百位、十位和个位,反转后输出。样例输入: 127 样例输出: 721首先将三位数读入变量n,然后进行分离。百位等于n/100(注意这里取的是商的整数部 分),十位等于n/10%10(这里的%是取余数操作),个位等于n%10。程序如下:#include<stdio.h>int main(){int n;scanf("%d", &n);printf("%d%d%d\n", n%10, n/10%10, n/100);return 0;}运行结果原创 2020-07-15 15:33:13 · 2567 阅读 · 0 评论 -
归并排序(算法竞赛入门)
归并排序按照分治三步法,对归并排序算法介绍如下。划分问题:把序列分成元素个数尽量相等的两半。递归求解:把两半元素分别排序。合并问题:把两个有序表合并成一个。前两部分是很容易完成的,关键在于如何把两个有序表合成一个。void merge_sort(int* A, int x, int y, int* T){ if(y-x > 1) { int m = x + (y-x)/2; //划分 int p = x, q = m, i = x; me原创 2020-07-15 15:10:59 · 188 阅读 · 0 评论 -
快速排序(算法竞赛入门)
快速排序是最快的通用内部排序算法。它由Hoare于1962年提出,相对归并排序来说不 仅速度更快,并且不需辅助空间(还记得那个T数组吗)。按照分治三步法,将快速排序算 法作如下介绍。划分问题:把数组的各个元素重排后分成左右两部分,使得左边的任意元素都小于或 等于右边的任意元素。递归求解:把左右两部分分别排序。合并问题:不用合并,因为此时数组已经完全有序。但事实上,快速排序本来就不是只有一种实现方法。“划分过程”有多个不同的版本,导致快速排序也有不同版本。快速选择问题。输入n个整数和一个正整数k转载 2020-07-15 14:43:02 · 211 阅读 · 0 评论 -
折半查找(算法竞赛入门)
定义:二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好,占用系统内存较少;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。折转载 2020-07-11 15:44:07 · 1186 阅读 · 0 评论 -
最大流问题——Ford Fulkerson算法
算法实践课留了自学算法。看了一些资料。https://www.cnblogs.com/kuangbin/archive/2011/07/26/2117636.html?tdsourcetag=s_pctim_aiomsg现在自己整理一下。前提引入1962 年L.R.Ford和D.R.Fulkerson把原始-对偶算法应用于最大流问题,提出最大流问题的标号算法。简称FF算法,下面引入相关概念。定义设容量网络N=<V,E,c,s,t>,f是N上的一个可行流。N中流量等于容量的边称作饱和边,转载 2020-06-22 17:26:24 · 13918 阅读 · 0 评论 -
算法实践—最少零钱问题
参考程序#include<stdio.h>#include<iostream.h>#include<string.h>#define MAX 20002#define INF 9999999#define min(a,b) (a)>(b)?(b):(a)int T[11],Coins[11],n;//硬币面值数组 T[],可以使用的各种面值的硬币个 数数组 Coins[],n 种不同面值的硬币int c[MAX];//数组 c[]存放要找的最少硬币个原创 2020-06-07 18:48:36 · 578 阅读 · 1 评论 -
算法分析与设计(考试重点算法)
算法//到了考试周了,整理了老师说的重点算法,作为自己的复习资料,木得脑子,我记不住啊啊啊啊啊啊三位四进制数#include “stdafx.h”#include int data[5];void f(int n){int k;if(n==3){for(k=0;k<n;k++)printf("%d “,data[k]);printf(”\n");}else{ ...原创 2020-04-29 18:25:52 · 1176 阅读 · 0 评论 -
地铁线路问题
假设有两条地铁线路,1 号线为直线线路,2 号线为环线线路,假设 1 号线的 各个站点名称分别为"A10", "A11", "A12", "A13", "A14", "A15", "A16", "A17",2 号线的各个站点名称分别为"B1", "B2", "B3", "A15", "B4", "B5", "B6", "A12", 另外,假设地铁都是双向运行的。现给出两个地铁站名分别作...原创 2020-06-08 19:30:25 · 1807 阅读 · 2 评论