算法
文章平均质量分 55
白首少年
年少不知曲中意,听懂已非少年人。
展开
-
算法(1)插入排序
最近在看《算法导论》,想着将其中涉及到的算法都实现一遍,这是第一篇,也是刚刚开始。 插入排序的算法大致是这样的,好比打牌,将桌上的牌在手上实现排序。 1.从桌上拿一张牌 2.从后向前与手中的牌面大小进行比较。若相比更小,则说明还没有到插入的位置,手上的此牌右移一位。 3.若相比大,则插入到此牌的前一张。 4.原创 2017-11-30 16:00:44 · 242 阅读 · 0 评论 -
算法(11)最小生成树(prim算法)
这里写代码片# 欢迎使用Markdown编辑器写博客MST(Minimum Spanning Tree,最小生成树)问题有两种通用的解法,Prim算法就是其中之一,它是从点的方面考虑构建一颗MST,大致思想是:设图G顶点集合为U,首先任意选择图G中的一点作为起始点a,将该点加入集合V,再从集合U-V中找到另一点b使得点b到V中任意一点的权值最小,此时将b点也加入集合V;以此类推,现在的集合V={a,转载 2018-01-18 00:02:03 · 287 阅读 · 0 评论 -
算法(13)DFS(深度优先遍历)&BFS(广度优先遍历)——邻接矩阵
在网上看到的这段程序是用邻接矩阵做的,有时间我会在后面用邻接链表尝试一下。 代码来自 http://blog.csdn.net/qq_22335577/article/details/40684573 不过这代码写得并不是很完美,还有优化的可能,对代码做了一些改动,在原思路不变的基础上。也做了一些注释,更方便阅读。#includeusing name转载 2018-01-21 21:40:25 · 419 阅读 · 0 评论 -
算法(12)图的表示——邻接链表和邻接矩阵
图有两种表示方法,邻接链表和邻接矩阵。 具体使用哪种表示方式更合适与图的属性有关。若是稀疏图(E 邻接链表的表示:struct node { int name; int length; struct node *next;};typedef node * graph; 邻接矩阵的表示:#define V原创 2018-01-21 20:46:39 · 1342 阅读 · 0 评论 -
算法(9)队列
队列是一种先进先出(first in first out)的数据结构,重要的元素有 头,尾, 队列长度。队列的操作基本有四种,验空(isEmpty),验满(isFull),出队(deQueue),入队(enQueue)。 实现队列有两种方法,数组和链表。这里数组的程序是我自己写的,链表的则是参考《C++ primer plus》P471上的代码。 关于用数组原创 2017-12-16 23:52:12 · 312 阅读 · 0 评论 -
算法(8)栈
栈是一种后进先出(last in first out)的数据结构,操作有四种: 1.isEmpty //检查栈是否为空,就是检查栈的指针是否指向栈底 2.isFull //检查是否满,检查指针是否指向栈顶 3.push //入栈,先检查是否满,没满则元素入栈,指针+1 4.pop //出栈,先检原创 2017-12-15 16:16:40 · 237 阅读 · 0 评论 -
算法(6)桶排序 //错误
//bucket sort//现在假设我有一堆蛋,包括麻雀蛋、鸡蛋、恐龙蛋,现在我要将这几种蛋排序下序;//有点常识就知道,这三种类别的蛋大小是不一样的,而且每一类蛋的大小也是有区别的,现在我对这三种蛋进行排序,我是这样排的://准备三个桶,把同一类别的蛋放到同一个桶中,然后对每一个桶内的蛋进行排序,然后按顺序从三个桶中取出相应蛋排序;//即,从放有麻雀蛋的桶里取出所有麻雀蛋,因为已经有序转载 2017-12-06 11:38:18 · 302 阅读 · 0 评论 -
算法(5)基数排序
基数排序,有点像我们平时比较数字的大小,不同的是我们比较数字大小是从最高位开始看,而基数排序则是从最低位进行比较。 基数排序的算法是这样是实现的,原创 2017-12-05 13:46:24 · 267 阅读 · 0 评论 -
算法(3)快速排序
快速排序的想法是这样的: 将数组的最后一个元素,array[last]作为主元进行判断,其实就是一个mark(标志)。比mark小的放前面,比mark大的放在后面,最后把mark放在正确的位置。 具体的步骤如下: 用三个指针进行标识,i :指向比mark小的最后一个量 j :用来遍历,从0~last-1,就是说不包括mark原创 2017-12-01 17:17:19 · 298 阅读 · 0 评论 -
算法(4)计数排序
计数排序不需要进行比较(//说实话,看到这句话的时候,我也是挺懵的,不比较怎么进行排序啊!),所以计数排序是有一定限制的。首先,计数排序必须是整数,范围为[0,max](//个人觉得这里的max其实也隐含了一个比较的过程)。想法是这样的,数组中的元素按大小排前面有几个,就把该元素放在新数组相应的位置。 计数排序的操作是这样的: 已知原数组的大小和最大的数,比如,原创 2017-12-04 14:54:15 · 284 阅读 · 0 评论 -
算法(7)最大值和最小值
废话不说,直接上《算法导论》上的话。 将一对输入元素相互进行比较,然后把较小的与当前的最小值进行比较,把较大值与当前的最大值进行比较。 如果n是奇数,那么总共进行了 3*floor(n/2)次比较。如果n是偶数,则是先进行一次初始比较,然后进行3*(n-2)/2 次比较。因此,不管哪一种情况,总的比较次数至多是 3*floor(n/2)。原创 2017-12-11 23:48:54 · 1891 阅读 · 0 评论 -
算法(10) 链表
这篇的代码不是自己写的是参考来的,虽然原博主代码写得不是很规范,但是基本思路是正确的,可作为学习的材料。 不带哨兵节点的双向链表即一般的双向链表,有一个头指针指向第一个节点,每个节点有key值和两个指针next和pre,分别指向前后相邻的节点,头结点的pre=NULL,尾节点的next=NULL,比较明了,但是也有麻烦的地方:在做查找删除节点等操作的时候,免不了要判断边界条件转载 2017-12-19 21:34:45 · 238 阅读 · 0 评论 -
算法(6)桶排序 //续上篇
周末了,才终于有时间把没写完的算法接着写下去。先来看上面那篇的代码。#include #include using namespace std; void bucketSort(vector& vec) { int length=vec.size(); vector buckets(length,0);//准备一堆桶,容器的下标即待排序数组的原创 2017-12-10 00:36:04 · 273 阅读 · 0 评论 -
算法(2)堆排序
堆排序的操作时这样的: 有三个指针(不是C里的物理指针)指向堆中的父结点和左右结点,分别是idx(父),left,right 。 还有一个largest指向 这三者中最大的那个。 如果,idx不等于largest,则交换 array[idx]和array[largets]的值,然后从largest开始向后递归。注意:这只是完成一次,父>左右原创 2017-12-01 11:25:56 · 281 阅读 · 0 评论 -
算法(14)最小生成树(kruskal算法)
平时时间不够,周末才有点时间看看算法。 程序实现有空补上,先把原理写下来,回忆的时候也方便一些。************************************************************************************************************** kruskal和prim都是贪心算法的应用原创 2018-01-27 22:14:10 · 266 阅读 · 0 评论