![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法分析
文章平均质量分 61
bama2488313716
这个作者很懒,什么都没留下…
展开
-
常见排序算法的时间复杂度、稳定性总结
常见排序算法包括:插入排序,希尔排序,冒泡排序,选择排序,快速排序,堆排序,归并排序,基数排序 名称 时间复杂度(按照最好、最坏、平均排列) 空间复杂度原创 2015-03-25 11:58:37 · 680 阅读 · 0 评论 -
输出给定字符串的组合情况
// 求给定字符串的组合情况(注意是组合,不是排列)// 思路:可以考虑组合字符串中只有1个字符、只有2个字符、只有3个字符、、、、、、只有n-1个字符// 定义组合字符串中有m个字符(n>m>=0 0代表1个字符) 则这m个字符中的第一个可以从原字符数组中// 的第0个开始取,则后面的m-1个字符则必须从0+1个开始取,直到取到的字符长度等于m为止//原创 2015-09-08 15:44:09 · 660 阅读 · 0 评论 -
给定字符串的所有排列
对于这类问题之前想到的解决方案都是 借助标志数组和递归的方式找出所有排列情况:代码如下:#include#include// 定义数组长度#define LEN 20//原数据数组char data[LEN];//组合得到的目标数据数组char desData[LEN];//标志数组用于记录哪些字符已经使用,避免重复使用同一字符uns原创 2015-09-08 11:10:01 · 581 阅读 · 1 评论 -
递归方式输出n位格雷码
#include#include#includeusing namespace std;/// 第一次遇到递归输出格雷码这道题的时候,就知道格雷码的编码上肯定是存在某种规律的,但是我找到的各种规律却///很难用代码描述出来。后来在网上找了很多资料,发现格雷码原来有这样一种规律:/// n位格雷码其实是在n-1位格雷码的基础上添加0、1得到的,添加规律为 n-1位格雷原创 2015-09-07 14:27:56 · 1607 阅读 · 0 评论 -
找n个数字中第k小的元素
利用快速排序的方法寻找第k小的数据,该方法的时间复杂度平均为O(n),可以满足一般情况下的查找算法#include // res代表开始查找的元素的地址,n代表查找的范围,nTh代表查找该范围内的第nTh小的元素int FindNth(int*res,int n,int nTh) {//如果查找的范围为1,直接返回该元素 if (n原创 2015-04-14 20:33:19 · 1625 阅读 · 0 评论 -
斐波拉契数列循环方式实现, 数学公式实现。
定义变量a存储f(n)的值,变量b存储f(n-1)的值 按照循环的方式求得最终的值,保存在变量a里面。#includeint a,b;void CalFBList(int n);int main(){ int n; while(scanf("%d",&n)!=EOF) { CalFBList(n); printf("%d\n",a); }原创 2015-03-12 17:33:10 · 1777 阅读 · 1 评论 -
旋转链表,递归实现
思路:将原链表看成两部分,一个部分表示完成旋转的;一个部分表示未完成旋转的。分别通过两个指针desHead和resHead指向两个链表,在一次函数递归中需要完成的是将未完旋转链表的头指针 P 中的next指针指向已完成旋转队列的头结点Q.并将P添加到已完成队列,从未完成队列中移除P,该表Q当前的指向,使得Q指向新加入的结点P。一下是代码实现。 #includestruct原创 2015-09-02 16:29:42 · 663 阅读 · 1 评论 -
快速排序
快速排序思路:确定数组最后一个元素为标杆,从数组的元素与标杆做比较,如果不大于标杆则跳过,继续比较下一个元素,找到比标杆大的元素则停止比较,并将这个元素放到数组末端未与标杆做比较的元素的位置上。(第一次的时候就是数组最后一个元素); 同理,从末端未比较的元素里面找出小于标杆的元素,将这个元素放到数组前面刚刚比较过的那个元素的位置上; 循环以上步骤,直到遍历完数组,将标杆放到相遇点上; 再以标原创 2015-03-13 11:09:14 · 540 阅读 · 1 评论 -
字符串中最长的回文子串问题
此题参考Manache算法,网上很多网友都说需要在转换后的字符串(即是在字符串中添加了‘#’)的最前面加上一个额外的字符,但是我觉得没有必要这么做: 最初的时候我选择第二个字符作为mid 然后寻找后面是否有更适合做mid的字符,如果有则替换。具体代码实现如下:#include #include #define MIN(a,b) ((a)>(b)?(b):(a))v原创 2015-04-21 16:33:45 · 548 阅读 · 0 评论 -
找出一个个既有正数又有负数的数组中子数组的和的最大值
//思路:设前面k项之和为sum(最开始时k为0),将k+1开始的项逐项加到sum中,注意在这个过程中如果出现了负数则需要对当前的sum值保存一次了,因为负数会拖后腿的;如果sum的值已经小于0,则可以认为前面的项之和在拖后面的子数组的后腿,在这种情况下可以撇开前面的子数组 将sum值赋值为0,重新寻找子数组。#includeint MaxSum;void FindMax(in原创 2015-04-15 09:49:13 · 2390 阅读 · 0 评论 -
二叉树的构造
//本文档主要实现通过正确的括号表示法表示的二叉树字符串创建二叉树#includeusing namespace std;#define LEN 1000//定义二叉树节点的数据结构struct BTNode{ char data; BTNode*left; BTNode*right;};//创建二叉树void CreateBTNode(B原创 2015-03-24 14:58:40 · 577 阅读 · 0 评论 -
希尔排序
希尔排序思路:希尔排序就是插入排序的一种,希尔排序首先确定分组大小,组内采用直接插入排序;然后再减少分组,直到组数为1时全部元素都排好了顺序。代码实现:#include void ShellSort(int*ptr,int n);void PrintList(int*ptr,int n);int main(){ int n,data[1000],i; whi原创 2015-03-12 18:12:55 · 406 阅读 · 0 评论 -
求出字符串中第一个只出现一次的字符,要求时间复杂度小于O(2n)
原文链接:http://blog.csdn.net/zzran/article/details/8508175思路:借助两个数组,第一个数组保存每个字符出现的次数,第二个数组保存源字符串中每个字符出现的顺序(数组下标为顺序,数组值为源字符串中的字符),遍历第二个数组并对比对一个数组中该字符出现的次数,如果为1次,则代表已经找到第一个只出现一次的字符。转载 2015-09-18 21:39:44 · 666 阅读 · 0 评论