简单算法
丨Q ,Q丨
这个作者很懒,什么都没留下…
展开
-
求序列中和最大的的子序列
求序列中的和最大的子序列(C语言)方案一:遍历所有子序列,然后求出和最大的子序列#include <stdio.h>int main(void){ int a[1001]; int n;//序列中有n个元素 int i,j;//循环变量,用来遍历所有子序列 int max,sum;//求最大值 int p,q;//存储和最...原创 2018-06-12 18:11:52 · 284 阅读 · 0 评论 -
将数组中前m(指定个数)个数移到数组后边
将数组中前m(指定个数)个数移到数组后边方案一:可以将第一个元素向后移m次,可达目的。例如:date[5]={1,2,3,4,5}; 假设m=2;将date[0]第一次移到最后面得到2,3,4,5,1将date[0]第二次移到最后面得到3,4,1,5,2最终结果1,2,3,4,5 =>3,4,5,1,2可以写一个将首元素放至最后的函数,然后调用m次可达到目的#include <stdi...原创 2018-06-15 00:20:10 · 4042 阅读 · 0 评论 -
多元最短路径——Floyd-Warshall算法
多源最短路径——Floyd-Warshall算法首先分析这张图就拿从1到3,可以直接1->3,也可以1->2->3,我们发现,通过一个“中转”的2,1->3路径会变短。可以在一个路径中插入另一个顶点,这样可能会比直接过去的路径更短,假设每个顶点都经过顶点2中转,可以有这样的语句。我们用二维数组graph[][]存储图int i;int j;fo...原创 2018-09-09 22:00:40 · 1009 阅读 · 0 评论 -
归并排序
归并排序(C语言实现)1.归并的最后一步若一个序列,可以分成个有序,并且顺序相同(同升同降),例如:序列 A <8,5,3,7,4,2>就可以分成两个有序序列 B<8,5,3> 和序列 C<7,4,2> 。这时我们可以比较序列B和序列C的第一个元素,8>7,所以,序列A排序后的最大值为8,序列B变为<5,3>。同样的道理,两个有序的...原创 2018-09-06 19:42:08 · 139 阅读 · 0 评论 -
单链表的快速排序
单链表的快速排序(以升序为例)1.思想:与顺序表(数组)的快速排序思想相同。(1)在序列中选择一个数字作为基准temp。(2)把小于基准数字temp的数字放在temp之前,把大于基准数字temp的数字放在基准数字temp之后。(3)将序列从temp处分为两段。(4)两个子序列在分别执行(1)(2)(3)(4),这是一个递归过程。2.实现:(1)为了方便操作,选取第一个结...原创 2018-10-16 22:24:43 · 277 阅读 · 0 评论 -
三元组顺序表快速转置
三元组顺序标的快速转置对于稀疏矩阵,为了节省空间,通常使用 三元组顺序表 和 十字链表存储。对于矩阵,转置运算是很常见的。对于三元组顺序表,如果仅仅将顺序表中每个元素的行号和列号进行交换,生成的新三元组顺序表不是真正的三元组顺序表,因为,行号不是依次递增的,当然,也可以先进行交换行号列号,再对它进行按行号升序的排序,但涉及到排序,就会很麻烦,所以,介绍一种快速转置的方法。如果要遍历一次...原创 2018-10-17 17:31:25 · 4628 阅读 · 4 评论 -
马踏棋盘及其优化
马踏棋盘及其优化问题描述:在8*8的国际象棋棋盘中的任何一个位置,放置一个马(棋子),使其按照马在国际象棋中的规则(走日)进行移动,求其中的一个解。问题分析:这其实是一个深度优先搜索的问题,深度优先搜索一般使用递归实现,在这里,为了学习,使用我们更不熟悉的栈来操作。算法:1.给定一个起点,将起点入栈,步数step=1。2.在map数组中的该位置的值赋为step;step+...原创 2018-10-23 16:05:05 · 575 阅读 · 0 评论 -
堆排序
堆排序算法思想:1.堆排序应用了最小(大)堆的根节点是最小(大)值这一特性。2.每次取出根结点的最值,再将最右边的叶结点放到根结点的位置。3.基于第二步,向下调整根结点的元素,直到变成一个新的最小(大)堆。#include <stdio.h>#include <stdlib.h>typedef struct{ int data[1001];...原创 2018-10-23 21:50:45 · 88 阅读 · 0 评论 -
合并有序的顺序表
合并顺序表问题描述: 将两个升(降)序的顺序表合成一个升(降)序的顺序表。(写下来以升序为例)分析:1.设有两个升序的顺序表s1,s2;合成一个顺序表s。2.则顺序表s的第一个元素是最小的,也就是顺序表s1和s2两个顺序表中的最小值,这个最小值一定在s1或s2的第一个元素。3.找到最小值,接下来s的第二个值是谁呢?是s1和s2构成的集合中,除了s中的第一个值的最小值。4.用...原创 2018-11-22 00:56:02 · 2724 阅读 · 0 评论 -
KMP的next究竟是什么
KMP模式匹配算法的next数组到底是什么?Ⅰ.为了搞清楚这个问题,首先先看个例子基于了解了KMP算法,我们明白,当i和j对应的字符不相等时,我们不会对i进行回溯,而是调用了j=next[j],使j到达一个位置,但是这个位置究竟是哪里,就需要进行一定的计算,在计算之前,先让我们搞清楚这个next究竟是个啥?Ⅱ.next值究竟是个啥?对于上面的例子,i和j对应的字符不匹配,就需要j...原创 2018-11-25 01:59:44 · 631 阅读 · 0 评论 -
字符串——删除字符串中的大写字母
将一个字符串中的大写字母删去,在现有知识范围,有以下几种方法①遍历字符串,找到大写字母,将该大写字母后边的元素(包括\0)全部向前移一位,可将该大写字母删去...原创 2018-05-16 21:51:12 · 13347 阅读 · 4 评论 -
输出数组中最大值及其个数
#include <stdio.h>int main(void){ int a[10]; int j,i,max; j=1; //初始化最大值个数,最少有一个 for(i=0;i<10;++i) { scanf("%d",a+i); } max=a[0]; for(i=0;i...原创 2018-04-23 22:26:10 · 4193 阅读 · 0 评论 -
找到数组中最大值及其所在位置的下标
#include <stdio.h>int main(void){ int a[10]; int i,index_max; //index_max用于接收最大值下标 for(i=0;i<10;++i) { scanf("%d",a+i); } index_max=0; //初始化最大值下标 for(i=1;i&...原创 2018-04-23 22:34:11 · 17176 阅读 · 4 评论 -
输出数组中的最大值与次大值,以及它们的下标
#include <stdio.h>int main(void){ int index_max,index_sec,i; int a[10]; for(i=0;i<10;++i) { scanf("%d",a+i); } if(a[0]>a[1]) { index_max=0; index_...原创 2018-04-23 22:52:12 · 6977 阅读 · 0 评论 -
用栈解决括号配对问题
char stacks[10000]; //遍历字符串,将左括号入栈,右括号与栈顶配对,若匹配,则左括号出栈,栈顶减一int matching(char *p,int n) //定义函数,用来检测括号是否配对,p为字符串首地址,n用来遍历字符串{ int i,top; ...原创 2018-04-24 21:34:27 · 177 阅读 · 0 评论 -
用链表实现插入排序
#include <stdio.h>#include <stdlib.h> //由于要使用malloc()函数,需要加载该头文件struct linked_list //创建结构体,即链表的每个节点,用于储存数据和下一个节点的地址{ int date; struct linked_list...原创 2018-05-05 18:12:55 · 1040 阅读 · 1 评论 -
字符串——将一字符串从中间一分为二,并将前半段和后半段按顺序交换
对于一个字符串s[x]来说,若将其从中间一分为,并前后段按顺序进行交换,最容易想到的就是用i,j两个变量,分别指向前半段与后半段的第一个元素,然后交换并同步自增,直到交换完毕;i进行循环时,i的范围是从0到L/2-1(L=strlen(s))(i的范围与L的奇偶性无关);j进行循环时,就会出现一个问题,L为奇数时,j的初始值为L/2+1,j为偶数时,j的初始值为L/2;对于j这种情况,可以有两种解...原创 2018-05-15 20:05:18 · 5044 阅读 · 0 评论 -
CSP认证201903-2 二十四点
CSP认证201903-2 二十四点可以看到,这个问题就是简单的表达式求值,而且只有4个数,没有括号,可以用栈很简单的解决步骤说明:使用两个栈,一个保存操作数,一个保存运算符。 扫描表达式字符串,如果是数字,则将数字入栈。 如果是运算符,则需要看优先级;如果这是第一个运算符或者这个运算符的优先级比栈顶的运算符的优先级更高,则将这个运算符入栈。 如果扫描到一个运算符A,运算符A...原创 2019-09-03 16:45:09 · 334 阅读 · 0 评论