算法图解
美林琳琳
这个作者很懒,什么都没留下…
展开
-
归并排序——将两个有序表直接归并为一个有序表
归并排序是多次将两个或两个以上的有序表合并成一个新的有序表。最简单的归并是直接将两个有序的子表合并成一个有序的表,即二路归并二路归并的排序基本思想是: 将a[0……n-1]看成是n个长度为1的有序序列,然后进行两两归并,得到n/2(向上取整)个长度为2(最后一个有序序列的长度可能为1)的有序序列,再进行两两归并,得到n/4(向上取整)个长度为4(最后一个有序序列的长度可能小于4...原创 2018-07-23 13:06:48 · 12362 阅读 · 2 评论 -
约德尔测试
说起约德尔人的未来,黑默丁格曾经提出了一个约德尔测试,将约德尔人的历史的每个阶段都用一个字符表达出来。(包括可写字符,不包括空格。)。然后将这个字符串转化为一个01串。转化规则是如果这个字符如果是字母或者数字,这个字符变为1,其它变为0。然后将这个01串和黑默丁格观测星空得到的01串做比较,得到一个相似率。输入每组输入数据为两行,第一行为有关约德尔人历史的字符串,第二行是黑默丁格观测星空得...原创 2018-07-29 12:44:35 · 195 阅读 · 0 评论 -
二分查找(折半查找)
二分查找是一种算法,其输入是一个有序的元素列表(必须是有序的),如果查找的元素包含在列表中,二分查找返回其位置,否则返回NULL比如说有一个1-100的数字,我随机的选择其中一个数字(假设为60),你需要以最少的次数猜到我所选择的数字,每次猜测后,我会告诉你大了,小了,对了。假设你第一次从1开始猜,小了第二次:2 小了第三次:3 小了……第五十九次:59小了...原创 2018-07-21 00:07:47 · 147878 阅读 · 12 评论 -
选择排序
排序方法是很重要的一种算法,很多其他算法都是在排序算法基础上进行的。比如二分查找(或者称为折半查找)就要求必须有序。选择排序的时间复杂度为n平方 举个例子来说,假设你手机里存储了很多首歌曲,你需要把这些歌曲按照播放次数进...原创 2018-07-21 10:20:27 · 161 阅读 · 0 评论 -
欧几里得算法求最大公约数的递归和非递归实现
递归定义必须是有明确含义,是指必须一步比一步简单,最终是有终结的,绝不能无限循环下去所有的递归函数都能找到对应的非递归定义递归的性能相对于非递归来说,并没有性能上的优势,实际上,有时候使用循环的性能更好。如果使用循环,程序的性能可能更高,如果使用递归,程序可能更容易理解。如何选择要看什么对你更重要 第一种,用于计算gcd(m,n)的欧几里得算法(递归)举个例子来简单的解释一下欧...原创 2018-07-21 11:12:26 · 2693 阅读 · 1 评论 -
递归——求n! 和 Hanoi汉诺塔问题
什么是递归?在定义一个过程或函数时出现调用本过程或本函数的成分,称为递归。若调用自身,称为直接递归。若过程或函数p调用过程或函数q,而q又调用p,称为间接递归。 尾递归:如果一个递归过程或递归函数中递归调用语句是最后一条执行语句,则称这种递归调用为尾递归。 递归算法通常把一个大的复杂问题层层转化为一个或多个与原问题相似的规模较小的问题来求解,只需要少量的代码就可以描述出解题过程...原创 2018-07-21 13:11:04 · 457 阅读 · 0 评论 -
直接插入排序
插入排序的基本思想是:每次将一个待排序的元素,按其关键字大小插入到已经排好序的子表中的适当位置,直到全部元素插入完成为止。直接插入排序思路:假设待排序的元素存放着数组a[0……n-1]中,排序过程中的某一个时刻,a被划分成两个子区间a[0……i-1]和a[i……n-1](刚开始时i=1,有序区只有a[0]一个元素),其中,前一个子区间是已排好序的有序区,后一个子区间则是当前未排序的部分,不妨称...原创 2018-07-26 16:23:24 · 437 阅读 · 0 评论 -
各种内排序方法的比较和选择
通常可按照平均时间复杂度将排序方法分为3类:平方阶O(n2)排序,一般称为简单排序,例如直接插入排序、直接选择排序、冒泡排序 线性对数阶O(nlogn)排序,如快速排序,堆排序和归并排序 线性阶O(n)排序,如基数排序(假定数据的位数d和进制r为常量时) 各种排序方法的性能 排序方法 平均情况 最坏情况 最好情况 空间复杂度 稳定性 复杂性 ...原创 2018-07-26 16:48:35 · 2043 阅读 · 0 评论 -
快 速 排 序
快速排序使用分而治之(divided and conpuer 即D&C)的策略。快速排序的平均时间复杂度为O(nlogn),最差情形时间复杂度O(n2),额外空间为O(logn),是一个不稳定的算法。快速排序是由冒泡排序改进而得的,它的基本思想是:在待排序的 n 个元素中任取一个元素(通常取第一个元素)作为基准,把该uansu放入适当的位置后 ,数据序列被次元素划分成两部分,所有...原创 2018-07-21 17:12:30 · 187 阅读 · 0 评论 -
利用递归求给定数组的和
求数组的和并返回结果,利用循环简直分分钟就能完成这个任务给定一个数组,例如2,4,5,6,7。求和简直不要太容易,过程不用说,直接累加就好,代码在下面:#include<stdio.h>#include<iostream>using namespace std;int sum(int a[],int n){ int res=0; for(int...原创 2018-07-21 19:03:23 · 5989 阅读 · 1 评论 -
顺 序 查 找
先前在博客中已经写了二分查找的方法,想了想,今天还是补上顺序查找,以方便对两种查找方法进行一个比较。顺序查找是一种最简单的查找方法,它的基本思路是:从表的一端开始,顺序扫描线性表,依次将扫描到的关键字和给定值K进行比较,若当前扫描到的关键字与k相等,则查找成功,若扫描结束,仍未找到关键字等于k的元素,则查找失败#include<stdio.h>#include<ios...原创 2018-07-22 12:43:30 · 138 阅读 · 0 评论 -
冒泡排序
冒泡排序和快速排序都属于交换排序,交换排序的基本思想:两两比较待排序的关键字,发现两个元素的次序相反时即进行交换,直到没有反序的元素为止冒泡排序,也成为气泡排序,是一种典型的交换排序方法,其基本思想是:两比较待排序元素的关键字,发现两个元素的次序相反时即进行交换,直到没有反序的元素为止。快速排序之前也已经进行过记录,这里记录一下冒泡排序 通过无序区中相邻元素间关键字的比较和位置的交换...原创 2018-07-22 13:24:53 · 116 阅读 · 0 评论 -
“上台阶”的走法
题目描述有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第m级,共有多少走法?注:规定从一级到一级有0种走法。输入输入数据首先包含一个整数n(1<=n<=100),表示测试实例的个数,然后是n行数据,每行包含一个整数m,(1<=m<=40), 表示楼梯的级数。输出对于每个测试实例,请输出不同走法的数量。解题思路:首先理解这个题的考点...原创 2018-07-28 16:34:15 · 1281 阅读 · 2 评论 -
读取文本文件并显示在屏幕上
#include<stdio.h>#include<string.h>void main(){ FILE *fp; //创建一个文件指针*fp char ch; fp=fopen("D:/data.txt","r"); //以只读方式打开D:\data.txt文件 if(fp==NULL) printf("can not open!\n")...原创 2018-04-22 21:37:38 · 13812 阅读 · 3 评论 -
读取文本文件并存储在存储单元中,如:数组,类等
源代码:#include<iostream>using namespace std;void main(){ FILE *fp; //创建一个文件指针*fp char (*str)=new char[]; //动态分配数组 int i=0; fp=fopen("D:/data.txt","r"); //以只读方式打开D:\data.txt文件 if(fp=...原创 2018-04-25 23:19:48 · 1241 阅读 · 0 评论 -
归并排序
归并排序法的基本思想是:将带排序元素分成大小大致相同的2个子集合,分别对每个子集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合归并排序的效率为O(nlogn),归并排序具有稳定性归并排序可由将两个有序表合并为一个有序表来进行理解,理解了前一篇博客归并排序——将两个有序表直接归并为一个有序表,再来理解归并排序就较为简单了#include<stdio.h>#i...原创 2018-07-23 16:50:07 · 144 阅读 · 0 评论 -
贪婪算法——Prim 算法
在实践中常常会遇到这样的问题:给定n人点,把它们按照一种代价最低的方式连接起来,使得任意两点之间都存在一条路径。这样的问题可应用在各类网络的设计,包括通信网络、计算机网络、交通网络以及输电网络,从而能够以最低的成本实现网络联通。另外,它也有助于构造旅行商等难题的近似解。 定义:通图的一棵生成树是包含图中的所有顶点的连通无环子图(也就是一棵树)。加权连通图的一棵最小生成树是图的一棵权重最...原创 2018-07-24 12:40:15 · 745 阅读 · 0 评论 -
求所有小于等于n的素数
设计一个程序,输出所有小于等于n(n为一个大于2的正整数)的素数。要求: 1、每行输出10个素数 2、尽可能采用较优的算法#include <iostream>using namespace std;int prime(int n){ int i; bool *prime = new bool[n+1]; for(i=2...原创 2018-07-24 16:55:08 · 7756 阅读 · 0 评论 -
计算任一输入的正整数的各位数字之和
计算任一输入的正整数的各位数字之和,并分析算法的时间复杂度算法如下,时间复杂度为O(1)?#include <iostream>using namespace std;void sum(int n){ int m;//暂存各位数 int res=0;//结果 cout<<"res="; while(n){ m=n%10;//当前个位数 n=...原创 2018-07-24 17:23:36 · 14817 阅读 · 0 评论 -
判断一个字符串是否为“回文”
编写一个程序,判断一个字符串是否为“回文”(顺读和倒读都一样的字符串称为“回文”),并分析算法的时间复杂度#include <stdio.h>#include<iostream>#include<string>using namespace std;int main(void){string str;//定义字符串cout<<"Pl...原创 2018-07-24 21:44:26 · 11165 阅读 · 1 评论 -
头插法和尾插法建立单链表
在进行单链表的基本运算之前必须先建立单链表,建立单链表的常用方法有两种:头插法建表和尾插法建表头插法建表,从一个空表开始,读取字符数组a中的字符,生成新节点,将读取的数据存放到新节点的数据域中,然后将新节点插入到当前链表的表头上,直到读完字符数组a的所有元素为止。头插法建表虽然简单,但生成的链表中节点的次序和原数组的次序相反,若希望两者的次序一致,可采用尾插法建立 尾插法建表,该算...原创 2018-07-24 22:45:37 · 20619 阅读 · 0 评论 -
利用顺序栈判断一个字符串是否是对称串
利用一个顺序栈,判断一个字符串是否是对称串。所谓对称串是指从左向右读和从右向左读的序列相同。(有些类似上一篇博客所说的回文)解题思路: 对于字符串str,先将其所有元素进栈。从头开始扫描str,同时出栈元素,将出栈元素与从头开始扫描的str元素相比较,若不同则返回false。当str扫描完毕后返回true。实际上,从头开始扫描是从左向右读,出栈元素是从右向左读,它们相同的话则是...原创 2018-07-25 08:35:06 · 16958 阅读 · 4 评论 -
利用栈判断输入的表达式中括号是否配对
解题思路: 在表达式括号配对时返回true,否则返回false。设置一个链栈st,扫描表达式exp,遇到左括号时进栈,遇到右括号时若栈顶为左括号,则出栈,否则返回false。当表达式扫描完毕,栈为空时返回true,否则返回false。算法如下:#include<stdio.h>#include<iostream>#include<string...原创 2018-07-25 09:24:37 · 12189 阅读 · 0 评论 -
确定字符串互异
编写一段程序,确定一个字符串的所有字符是否全部都不同#include<stdio.h>#include<iostream>#include<string>using namespace std;int main(){ string str; int i,j; int flag=1; cin>>str; int len=str....原创 2018-05-16 22:09:12 · 169 阅读 · 0 评论 -
统计字符出现次数
给定一个字符串,找出这个字符串中首先出现三次的那个英文字符,并将其输出。#include<iostream> #include<cstdlib> #include<string> using namespace std;int main(){ string s; while(getline(cin,s)) //获...原创 2018-05-06 22:15:01 · 695 阅读 · 0 评论 -
c++头文件
转载来源:https://zhidao.baidu.com/question/98945525.html转载来源:https://zhidao.baidu.com/question/590920462.html常用的一些头文件:#include <iostream.h> //数据流输入/输出 iostream.h是input output stream的简写,意思为标准的...转载 2018-05-06 14:15:55 · 211 阅读 · 0 评论 -
翻转数组
今天刷题的时候遇到了一道数组翻转的编程题,思想和之前的字符串翻转有点像,但还是有一点区别。题目描述给定一个长度为n的整数数组a,元素均不相同,问数组是否存在这样一个片段,只将该片段翻转就可以使整个数组升序排列。其中数组片段[l,r]表示序列a[l], a[l+1], ..., a[r]。原始数组为a[1], a[2], ..., a[l-2], a[l-1], a[l], a[l+1], ...原创 2018-07-28 09:42:05 · 1216 阅读 · 0 评论