
数据结构与算法
jimye
no one
展开
-
【排序算法】插入排序(C++实现)
插入排序的基本思想是每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。常见的插入排序有插入排序(Insertion Sort),希尔排序(Shell Sort),二叉查找树排序(Tree Sort),图书馆排序(Library Sort),Patience排序(Patience Sort)。下面介绍前两种:(一)直接插入排序最差时间复原创 2013-03-10 20:22:03 · 61822 阅读 · 8 评论 -
【编程珠玑】第一章电话号码排序
输入:一个包含100万个正整数的文件,每个数都小于1000万。如果在输入文件中有任何整数重复出现就是致命错误,没有其他数据与该整数相关联。输出:按升序排列的输入整数的列表。#include #include #include #include using namespace std;int randInt(int start, int end){ srand(ti原创 2013-05-15 16:38:37 · 1054 阅读 · 0 评论 -
【编程珠玑】第七章粗略估计
编程珠玑的这一章很有意思,要对于很多生活中的平时很少考虑的统计问题进行粗略估计,这看似与软件工程无关,但实则不然,书中提到在USA,“粗略估计”已经是工程院校的标准课程,这就难怪各种神级公司如微软、谷歌等在招人时会出现下面的一些面试题了:美国有多少量汽车?美国有多少个加油站?...文章中首先提到了一个经验法则,觉得很有用。“72”法则:假设以年利率r%投资一笔钱y年,如果r原创 2013-05-27 18:37:25 · 1336 阅读 · 0 评论 -
【编程珠玑】附录C时空开销模型
1、空间开销如果问大家sizeof(char)等于多少,大家一定都知道等于1字节。那么如果使用new运算法分别动态分配10个char变量,那么这10个char变量所占的内存空间就仅仅只有10字节吗?并不是!使用malloc动态分配可能会需要好几倍的额外开销。根据书中给出的测试程序,程序中定义了一个宏,在该宏定义中,首先给出相应结构的sizeof()信息,然后用类似下面的形式给出new分配的原创 2013-05-31 16:48:19 · 2017 阅读 · 0 评论 -
典型字符串匹配算法实现
0.序 相信大家对快捷键ctrl+F是做什么用的都应该很熟悉了,无论是文本编辑、网页浏览等程序上它都意味着字符串搜索,我们提供一个关键字,它将找到当前页面上的所有该关键字所在的位置。关键字称为模式串,在文本T中寻找模式串P出现的所有出现的位置,解决这种问题的算法叫做字符串匹配算法。字符串匹配算法可以说是计算机科学中最古老、研究最广泛的问题之一,并且字符串匹配的应用也随处可见,特别原创 2013-05-06 22:37:26 · 4109 阅读 · 0 评论 -
求解1-n之间的素数
1、简陋的算法:void prime(int n){ for (int i = 2; i < n; ++i) { int j; for (j = 2; j <= sqrt(i); ++j) // 如果i能被2到sqrt(i)之间的所有整数所整除,则其为素数 { if (i%j==0) break; } if (j>sqrt(i)) cout<<i原创 2013-04-16 09:18:03 · 6714 阅读 · 1 评论 -
【排序算法】交换排序(C++实现)
所谓交换,就是根据序列中两个记录值的比较结果来对换这两个记录在序列中的位置。交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动。常见的交换排序有冒泡排序(Bubble Sort),鸡尾酒排序(Cocktail Sort),奇偶排序(OddEven Sort),地精排序(Gnome Sort),快速排序(Quick Sort),臭皮匠排序(Stooge Sort),梳原创 2013-03-07 22:16:07 · 9321 阅读 · 1 评论 -
【排序算法】选择排序(C++实现)
选择排序算法就是每一趟从待排序的记录中选出关键字最小(最大)的记录,顺序放在已排好序的子文件的最后(最前),直到全部记录排序完毕。常见的选择排序有直接选择排序(Selection Sort),堆排序(Heap Sort),平滑排序(Smooth Sort),笛卡尔树排序(Cartesian Sort),锦标赛排序(Tournament Sort),循环排序(Cycle)。下面介绍前两种:(一)原创 2013-03-10 16:01:38 · 18940 阅读 · 3 评论 -
【排序算法】归并排序(C++实现)
归并排序是利用"归并"技术来进行排序。归并是指将若干个已排序的子文件合并成一个有序的文件。常见的归并排序有两路归并排序(Merge Sort),多相归并排序(Polyphase Merge Sort),Strand排序(Strand Sort)。下面介绍第一种:(一)两路归并排序最差时间复杂度:O(nlogn)平均时间复杂度:O(nlogn)最差空间复杂度:O(n)稳定性:稳定原创 2013-03-10 22:01:02 · 63378 阅读 · 12 评论 -
【排序算法】分配排序(C++实现)
与之前的那些比较排序不同,分配排序在排序过程无须比较关键字,而是通过"分配"和"收集"过程来实现排序。它们的时间复杂度可达到线性阶:O(n)。常见的分配排序有计数排序(Counting Sort),基数排序(Radix Sort),桶排序(Bucket Sort),美国旗帜排序(American Flag Sort),珠排序(Bead Sort),爆炸排序(Burst Sort),鸽巢排序(Pig原创 2013-03-11 13:13:56 · 3887 阅读 · 0 评论 -
【算法导论笔记】单源最短路径
最短路径估计和前驱结点的初始化INITIALIZE-SINGLE-SOURCE(G, s) for each vertex v∈G.V v.d = ∞ v.π = NIL s.d = 0 松弛操作 RELAX(u, v, w) if v.d > u.d + w(u, v) v.d = u.d + w(u, v) v.π = u原创 2013-04-10 17:56:07 · 982 阅读 · 0 评论 -
【算法导论笔记】所有结点对的最短路径问题
基于矩阵乘法的动态规划算法求解所有最短路径EXTEND_SHORTEST_PATHS(L, W) n = L.rows let L' = l'(i,j) be a new n*n matrix for i=1 to n for j=1 to n l'(i,j) = ∞ return L'SLOW-ALL-PATHS-SHORTEST-PATH原创 2013-04-11 15:09:47 · 1690 阅读 · 0 评论 -
【算法导论笔记】基本图算法
1、图的表示邻接链表和邻接矩阵两种。稀疏图常用邻接链表表示,稠密图通常用邻接矩阵表示。2、广度优先搜索广度优先搜索是最简单的图搜索算法之一,Prim的最小生成树算法和Dijkstra的单源最短路径算法都使用了类似广度优先搜索思想。该算法始终将已发现结点和未发现结点之间的边界,沿其广度方向向外扩展,也就是说,算法需要在发现所有距离源结点s为k的所有结点之后,才会发现距离源结点s为原创 2013-04-10 16:42:55 · 1690 阅读 · 0 评论 -
三种快速排序算法的实现(递归算法、非递归算法、三路划分快速排序)
快速排序的三个步骤:1、分解:将数组A[l...r]划分成两个(可能空)子数组A[l...p-1]和A[p+1...r],使得A[l...p-1]中的每个元素都小于等于A(p),而且,小于等于A[p+1...r]中的元素。下标p也在这个划分过程中计算。2、解决:通过递归调用快速排序,对数组A[l...p-1]和A[p+1...r]排序。3、合并:因为两个子数组时就地排序,将它们的合并并原创 2012-11-21 10:02:02 · 23458 阅读 · 5 评论 -
【算法导论笔记】最小生成树
在一个连通的无向图G=(V,E)中,找到一个无环子集T(是E的子集),既能够将所有的结点连接起来,又具有最小的权重,这时的T便成为最小生成树。解决最小生成树的两个常用算法为:Kruskal算法和Prim算法。如果使用普通的二叉堆,这两个算法的时间复杂度最小为O(ElgV)。但如果使用斐波那契堆,Prim算法的时间复杂度将改善为O(E+VlgV)。基本策略GENERIC-原创 2013-04-10 17:33:17 · 1092 阅读 · 0 评论