数据结构和算法
supermary863
这个作者很懒,什么都没留下…
展开
-
排列组合之组合问题算法实现
声明:本算法参考了网上其它的一些算法,在此表示感谢,由于是时隔很久的一个总结,相关参考链接已经忘了,故此处没有给出参考页面,敬请见谅~~~组合问题:问题:给定两个数n和r,求出从1到n中选出r个数的组合例如 n=5, r=3结果:1,2,3 1,2,4 1,2,5 1,3,4 1,3,5 1,4,5 2,3,4 2,3,5 3,4,5注意:如果你需要对一个数组的内容进行组合,你可以先对数组下标进行组合,然后再根据下标转换成对应的内容,故本算法具有通用性。1.采用回溯法实现分析:主要有两个回溯原创 2011-03-23 22:06:00 · 479 阅读 · 0 评论 -
八种常见排序算法总结
下面从稳定性、时间复杂度、空间复杂度对冒泡、选择、插入、快速、希尔、堆、归并、基数排序算法做一个简单的总结:排序策略排序算法稳定性平均时间复杂度空间复杂度交换排序冒泡排序稳定O(n2)O(1)快速排序不稳定 O(nlogn) O(1)选择排序选择排序不稳定O(n2)O(1)堆排序不稳定O(nlogn)O(1)插入排序插入排序稳定O(n2)O(1)希尔排序不稳定O(n1.f)0=O(1)归并排序归并排序稳定O(nlogn)O(n)分配排序原创 2011-04-01 12:17:00 · 787 阅读 · 0 评论 -
基数排序算法
<br />声明:本算法参考了百度百科中的相关文章,表示感谢~~~<br />/* * 基数排序 * 1)假设待排序的元素是由dk-1dk-2...d3d2d1个关键字组成 * 2)先按关键字d1进行排序,然后在前次排序的基础上,按照d2 * 排序,直到dk-1 * 稳定性:稳定的 * 空间复杂度 n*radix保存收集数据的空间 其中radix为关键字取值范围 * radix个指示每个队列元素个数的空间 * 时间复杂度: O(d(n+radix)) O原创 2011-03-31 22:54:00 · 610 阅读 · 0 评论 -
堆排序算法
<br />声明:本文参考了疯狂代码的文章,表示感谢,原文链接http://blog.csdn.net/jiqiren007/archive/2010/10/28/5972735.aspx<br />/* * 堆排序 * 1) 建堆,建堆是不断调整的过程,从len/2处开始调整,直到第一个节点,len是堆中元素的个数 * 建堆的过程是线性的过程,从len/2到0处一直调用调整堆的过程O(h1) + O(h2) + O(hlen/2), 其中h表示节点的深度,len/2表示节点原创 2011-03-30 17:36:00 · 565 阅读 · 0 评论 -
插入排序算法
<br />/* * 插入排序 * 基本思想 * 1)从第0个位置开始,假设第0个位置为最小,跳到第二个位置, * 如果比第0个位置的数要小,插到第0个位置的前面,跳到第三个 * 位置,在前面已经排好序的情况下,找到合适的插入点,其它 * 情况依次类推 * 2)总共需要插入n-1次 * 稳定性:稳定 * 空间复杂度:O(1) * 时间复杂度:最好O(n) 最差O(n2) 平均O(n2) */void InsertSort(int a[], int原创 2011-03-29 14:56:00 · 478 阅读 · 0 评论 -
希尔排序算法
<br />/* * 希尔排序 * 它是一种改进的插入排序 * 取一个小于n的增量d,然后将所有距离为d的分为一组,进行插入排序 * 然后增量减小,但是最后一个增量d=1 * 稳定性:不稳定 * 空间复杂度:O(1) * 时间复杂度:最好O(n) 最差O(n2) 平均O(n2) */void ShellPass(int a[], int n, int d){ int temp, j; for(int i=d; i<n; i++) { j = i;原创 2011-03-29 22:35:00 · 562 阅读 · 0 评论 -
快速排序算法
<br />/* * 快速排序 * 基本思想 * 通过一趟排序,将要排序的数据分割成两个部分 * 其中一部分数据比另外一部分数据都要小 * 然后分别对两个部分再进行快速排序 * 整个过程可以用递归来解决 * 稳定性:不稳定 * 空间复杂度:O(1) * 时间复杂度:最好O(nlog2n) 最差O(n2) 平均O(nlog2n) *//* * 划分 */int Partition(int a[], int left, int right){原创 2011-03-29 21:10:00 · 511 阅读 · 0 评论 -
归并排序算法
/* * 二路归并排序 * 基本思想 * 当只有一个元素的时候终止排序,超过一个元素的时候,将所有 * 元素分成大致相同的两个集合,然后分别对两个集合进行排序,最后 * 将排好序的集合进行归并 * 稳定性:稳定 * 空间复杂度:O(n) * 时间复杂度:最好O(nlog2n) 最坏O(nlog2n) 平均O(nlog2n) *//* * 归并 */void Merge(int a[], int low, int high){ int mid =原创 2011-03-29 18:19:00 · 512 阅读 · 0 评论 -
冒泡排序算法
/* * 冒泡排序(从小到大) * 基本思想 * 1)总共冒泡n-1次,每次进行相邻的两两相互比较,较大的交换到后面 * 2)一次冒泡总能将最大的一个数冒到最后,这样的过程类似于水中的气泡 * 上冒,故称冒泡排序 * 3)如果存在一次冒泡过程,没有任何数据进行交换,则说明已经有序,停止排序 这样可以提高性能 * 稳定性:稳定 * 时间复杂度:最好O(n) 最差O(n2) 平均O(n2) * 适用情况:n小时较好 */void BubbleSort(原创 2011-03-29 14:18:00 · 525 阅读 · 0 评论 -
选择排序算法
<br />#include <iostream>using namespace std;/* * 选择排序 * 基本思想 * 1)i从0到n-1,每次选择一个最小(最大)到i位置 * 2)总共需要选择n-1次 * 3)刚开始默认a[i]最小(最大) * 4)不要每次都交换,先记录索引号,最后一次再交换,可以提高性能 * 稳定性: 选择排序不稳定,例如 4 3 4 2 8, 4的先后顺序在交换的过程中被破坏了 * 时间复杂度:最好 O(n2) 最差 O(n2)原创 2011-03-29 12:40:00 · 501 阅读 · 0 评论 -
排列组合之排列问题的算法实现
声明:本算法参考网上了其它的一些算法,在此表示感谢,由于是时隔很久的一个总结,相关参考链接已经忘了,故此处没有给出参考页面,敬请见谅~~~排列问题:问题:给定两个数n和r,求出从1到n中选出r个数的排列注意:如果你需要对一个数组内容进行排列,你可以转换成上面的形式,先对数组下标进行排列,然后按照下标还原成数组内容,故任何排列都转换成上面的形式,本算法具有通用性。#include using namespace std;const int MAXSIZE = 100;//用来保存一种排原创 2011-03-23 18:25:00 · 780 阅读 · 0 评论 -
使用双栈实现表达式求值
<br />本文参考了iu_81的文章栈实现表达式求值,表示感谢!<br /> <br />算法要点:<br />1) 采用双栈,一个栈用来保存运算符,一个栈用来保存数据<br />2) 符号优先级设置<br /> i(+ -)< (* /) <br /> ii 相同运算符,栈内优先级高于栈外优先级<br /> ii 对于栈内:左括号的优先级最高 右括号优先级仅高于'#'<br /> ii 对于栈外:与上面相反<br /> 3)计算时机<br /> 当栈内运算符优先级 > 栈外运算符优先级:可转载 2011-04-26 11:06:00 · 7112 阅读 · 0 评论