数据结构与算法-C
mathtocomputer
这个作者很懒,什么都没留下…
展开
-
数据结构与算法(C语言版)__栈
栈是一种常用的数据结构,栈常用在系统软件和或者算法中。 栈使用数组来做顺序栈,链式站用链表来做。今天使用动态数组来设计栈。 栈,后进先出(LIFO),先进后出(FILO) push,进栈 pop,出栈 peek,看一下栈顶我使用的是VS Ultimate2013 新建一个空项目,在头文件里面添加两个头文件MyStack.h和MyUtil.h 在源文件里面添加main.cpp//MyUt原创 2016-12-20 22:40:55 · 323 阅读 · 0 评论 -
数据结构与算法(C语言版)__排列组合
排列组合(Permutation) 使用递归的方法实现排列组合 图中可以看到a后面跟着bc的排列组合,b后面跟着ac的排列组合,c后面跟着ab的排列组合,自然而然可以想到使用递归的方法。 #include<iostream>using namespace std;int c1 = 0;//查看进入迭代int c2 = 0;//查看返回迭代void Permutations(char原创 2016-12-19 21:48:35 · 1068 阅读 · 0 评论 -
数据结构与算法(C语言版)__list类
顺序容器 STL list类 实例化std::list对象 在list开头插入元素 在list末尾插入元素 在list中间插入元素 删除list中的元素 对list中元素进行反转和排序list就是一个双向链表下面看list的插入元素#include<iostream>#include <list>using namespace std;void PrintListContents(co原创 2016-12-26 22:11:04 · 652 阅读 · 0 评论 -
数据结构与算法(C语言版)__基数排序
基数: 十进制的基数是10,二进制的基数是2,。。。 先排最低位LSD 也可以先排最高位MSD下面看代码:#include<iostream>#include<list>using namespace std;//返回最大数的位数int maxdigit(int data[], int n){ int d = 1; int p = 10; for (int i =原创 2016-12-27 09:49:32 · 850 阅读 · 0 评论 -
数据结构与算法(C语言版)__树
数组的缺点:插入数据和删除数据都比较麻烦,因为要移动数据。 数组的优点:可以进行二分查找链表的优点:插入删除数据都比较快 链表的缺点:不能进行二分查找树=数组的优点+链表的优点树的术语: 结点 度 节点子树的个数 叶结点 父结点 子结点 兄弟结点 树的度 所有节点最大的度就是数的度 树的高度(深度)树有多少层原创 2016-12-27 13:07:53 · 393 阅读 · 0 评论 -
数据结构与算法(C语言版)__二叉树
二叉树的表示: 数组表示: 链表表示:二叉树的遍历: 前序遍历 中序遍历 后序遍历 层序遍历 今天我们用链表实现二叉树。 在VS2013中新建项目,在头文件中加入 二叉树.h在源文件中加入main.cpp//二叉树.h#ifndef _二叉树_H#define _二叉树_H#include<queue>using namespace std;template<class T>原创 2016-12-27 14:22:45 · 793 阅读 · 0 评论 -
数据结构与算法(C语言版)__二叉查找树
BST:二叉查找树 Binary Search Tree 二叉查找树的性质: 1.每一元素有一个键值,而且不允许重复 2.左子树的键值都小于根结点的键值 3.右子树的键值都大于根节点的键值 4.左右子树都是二叉查找树在VS2013中新建项目,在头文件中加入 二叉查找树.h在源文件中添加main.h//二叉查找树.h#ifndef 二叉查找树_H#define 二叉查找树_Henum原创 2016-12-27 16:23:06 · 406 阅读 · 0 评论 -
数据结构与算法(C语言版)__红黑树01
二叉查找树的问题在于它自己把第一个节点设置成根结点,红黑树就可以进行动态调整根节点,自动平衡二叉查找树。 平衡树和非平衡树 红黑树的特征:节点都有颜色,插入和删除节点时要遵守红黑树规则红黑树规则: 1.每个节点不是红色就是黑色的。 2.根总是黑色的。 3.如果节点是红色的,则它的子结点必须是黑色的。 4.从根到叶结点的每条路径,必须包含相同数目的黑色节点。修正方法: 1.改变节点的颜色原创 2016-12-30 09:58:39 · 478 阅读 · 0 评论 -
数据结构与算法(C语言版)__红黑树02
今天继续丰富红黑树,我们继续上一个博客今天写红黑树的insert功能 在头文件中添加Except.h和RedBlackTree.h在源文件中添加TestRedBlackTree.cpp//Except.h//返回异常#ifndef EXCEPT_H#define EXCEPT_H#include<string>using namespace std;class DSException{pu原创 2016-12-30 10:58:38 · 416 阅读 · 0 评论 -
数据结构与算法(C语言版)__红黑树03
今天继续丰富红黑树,添加树向左向右旋转 //Except.h#ifndef EXCEPT_H#define EXCEPT_H#include<string>using namespace std;class DSException{public: DSException(const string & msg = "") :message(msg){} virtual ~DSE原创 2016-12-30 11:04:01 · 439 阅读 · 0 评论 -
数据结构与算法(C语言版)__红黑树04
我们今天把双旋转加到红黑树里面,单旋转有的时候不能让二叉查找树平衡,所以需要调用双旋转。双旋转就是把两个单旋转放在一起形成双旋转。在头文件中加入Except.h和RedBlackTree.h,在源文件中加入TestRedBlackTree.cpp//Except.h#ifndef EXCEPT_H#define EXCEPT_H#include<string>using namespace st原创 2016-12-30 14:14:46 · 438 阅读 · 0 评论 -
数据结构与算法(C语言版)__插入排序
低级排序算法:冒泡排序,选择排序,插入排序 高级排序算法:归并排序,堆排序,快速排序 插入排序就是在已经排序的数据中从大往小比较,出现比该数小的就插入到该位置后面。#include<iostream>using namespace std;void InsertionSort(int *a, int n);int main(){ int x[] = { 2, 4, 6, 8, 0,原创 2016-12-20 08:57:27 · 418 阅读 · 0 评论 -
数据结构与算法(C语言版)__快速排序
最流行的排序算法,速度最快的排序算法 1962年 C.A.R. Hoare发明的快速排序算法 pivot枢纽,枢轴 递归快排选一个枢轴,比枢轴小的放左边,把比枢轴大的放右边,然后左右边递归。 左边开始找一个比枢轴大的,从右边开始找一个比枢轴小的,然后进行交换。#include<iostream>using namespace std;template<class T>void QuickS原创 2016-12-20 15:43:44 · 502 阅读 · 0 评论 -
数据结构与算法(C语言版)__红黑树05
继续完善我们的insert函数 红黑树新插入的节点都是红色的。新插入的节点X是内部孙子,双旋转 新插入的节点X是外部孙子,单旋转还要处理有两个红色孩子的节点。 在头文件中加入Except.h和RedBlackTree.h在源文件中加入TestRedBlackTree.cpp//Except.h#ifndef EXCEPT_H#define EXCEPT_H#include<string>u原创 2016-12-30 21:02:28 · 311 阅读 · 0 评论 -
数据结构与算法(C语言版)__红黑树06
今天给红黑树添加几个函数,分别是: find()查找 findMin()查找最小的 findMax()查找最大的 isEmpty()判断树是不是空的 makeEmpty()清空树 在头文件中添加Except.h、Wrapper.h和RedBlackTree.h在源文件中添加TestRedBlackTree.cpp下面是异常的定义//Except.h#ifndef EXCEPT_H#d原创 2016-12-31 13:14:55 · 328 阅读 · 0 评论 -
数据结构与算法(C语言版)__堆
完全二叉树叫做堆 完全二叉树就是在最后一个节点之前不允许有不满的节点(有空洞)用数组来做完全二叉树(堆)大顶堆,根上的数字最大(大的在上面) 小顶堆,根上的数字最小(小的在上面) 操作: 插入新节点—>向上渗透 删除根节点—>向下渗透插入新节点,先按顺序插入到节点上,然后和父辈交换 删除根节点,先把根节点删除,然后把最后一个节点加到根上,然后和子代交换堆用来做优先队列,用来排序(堆排序)原创 2016-12-31 17:18:28 · 438 阅读 · 0 评论 -
数据结构与算法(C语言版)__堆排序
算法:把未排序的数据一个一个放入堆里,然后再一个一个的取出来。我们今天使用上一个博客写的大顶堆MaxHeap.h//MaxHeap.h#ifndef _MAX_HEAP_#define _MAX_HEAP_template<class T>class MaxHeap{public: MaxHeap(int mx = 10); virtual ~MaxHeap(); b原创 2016-12-31 20:48:52 · 587 阅读 · 0 评论 -
数据结构与算法(C语言版)__递归的折半查找
下面对比递归和迭代算法实现二分查找: 折半查找每次都要折半,所以可以使用递归的方法。#include<iostream>using namespace std;int BinarySearch_I(int *a, const int x, const int n);int BinarySearch_R(int *a, const int x, const int left, const int原创 2016-12-19 20:31:15 · 2233 阅读 · 0 评论 -
数据结构与算法(C语言版)__递归
递归的是神,迭代的是人 自己调用自己 老奶奶讲故事 计算阶乘:使用递归/使用循环#include<iostream>using namespace std;void doA(){ cout << "Hello" << endl; doA();}int main(){ doA(); return 0;}老奶奶讲故事#include<iostream>usin原创 2016-12-19 20:03:40 · 420 阅读 · 0 评论 -
数据结构与算法(C语言版)__二分查找
二分查找(折半查找) 数据必须先排序,排序之后才能进行二分查找 220=2^{20}=100万(就是1M) 230=2^{30}=10亿(就是1G) 二分查找速度非常快#include<iostream>using namespace std;int BinarySearch(int *a, const int x, const int n);int main(){ int x[]原创 2016-12-19 16:35:35 · 495 阅读 · 0 评论 -
数据结构与算法(C语言版)__邻接矩阵
图,包含顶点和边,在C++里面可以用类来表示邻接矩阵吧图转化为二维矩阵,当图比较稀疏时可以用邻接表。#include<iostream>#define MAX_VERTS 20using namespace std;class Vertex{public: Vertex(char label){ Label = label; }private: char Label;};cla原创 2017-01-03 09:27:04 · 615 阅读 · 0 评论 -
数据结构与算法(C语言版)__邻接表
今天我们来看一个小例子#include<iostream>#include<list>using namespace std;class Vertex{};template<class T>class Graph{public: Graph(const int vertices) :n(vertices){ VertexList = new T*[n];原创 2017-01-03 10:40:31 · 459 阅读 · 0 评论 -
数据结构与算法(C语言版)__归并排序
归并排序是对两个已经排序的数组合并在一起。 下面使用迭代的方式实现归并排序#define _SCL_SECURE_NO_WARNINGS#include<iostream>#include<algorithm>using namespace std;template<class T>void Merge(T *initList, T *mergedList, const int l, const原创 2016-12-23 10:38:33 · 709 阅读 · 0 评论 -
数据结构与算法(C语言版)__图的搜索
DFS深度优先搜索,使用堆栈来实现 BFS广度优先搜索,使用队列来实现下面先看DFS#include<iostream>#include<stack>#define MAX_VERTS 20using namespace std;class Vertex{public: Vertex(char label){ Label = label; wasVis原创 2017-01-03 10:42:50 · 422 阅读 · 0 评论 -
数据结构与算法(C语言版)__队列
队列是很重要的数据结构,一般用来实现重要的系统软件开发,比如线程池,线程池的工作列表都是用队列实现的 队列先进先出(FIFO)或后进后出(LILO) 队首,队尾 队列的操作: Push 入队 Pop 出对 Front 队首 Rear 队尾 IsEmpty 是否为空 队列有两种实现方法,一种是使用动态数组,一种是使用链表来实现。 今天使用动态数组来实现顺序队列。在VS2013中新建原创 2016-12-23 10:42:59 · 357 阅读 · 0 评论 -
数据结构与算法(C语言版)__链表
数组的缺点:当插入数据时,后面的所有数据都要向后移位,删除数据时,后面的数据都要向前移位 所以出现链表,链表的插入和删除都比较快,链表不需要移位。 下面使用友元类和嵌套类实现链表 在VS2013中新建项目,在头文件中添加ThreeLetterList.h在源文件中添加main.cpp//ThreeLetterList.h#ifndef THREELETTERLIST_H#define TH原创 2016-12-23 13:29:14 · 463 阅读 · 0 评论 -
数据结构与算法(C语言版)__交换
1.使用三个变量,相互交换#include <iostream>using namespace std;int main(){ int a, b, tmp; a = 1; b = 10; cout << "交换之前" << endl; cout << "a = " << a << ", b = " << b << endl; tmp = a;//原创 2016-12-18 12:21:21 · 566 阅读 · 0 评论 -
数据结构与算法(C语言版)__链表2
今天用C++里面的模板实现链表 ListNode List 链表操作: Insert Delete Invert Concatenate原创 2016-12-24 21:38:16 · 282 阅读 · 0 评论 -
数据结构与算法(C语言版)__冒泡排序
冒泡排序(BubbleSort) 冒泡排序的时间复杂度O(n2)O(n^2) 基本原理:从左向右扫描数据,选择最大的数据,放在右边 要点:比较相邻的两个数,如果左边的数大于右边的数就进行交换原创 2016-12-18 13:22:59 · 791 阅读 · 0 评论 -
数据结构与算法(C语言版)__链表的迭代器
STL中的链表#include<list>链表有一个迭代器,迭代器可以一个一个的输出数据,功能强大。今天我们也设计链表迭代器。 我们自己设计的链表迭代器//MyList.htemplate<class Type>class ListIterator{public: Boolean NotNull(); Boolean NextNotNull; Type* First(原创 2016-12-24 23:12:05 · 752 阅读 · 0 评论 -
数据结构与算法(C语言版)__循环链表
单向循环链表 带有表头结构的循环链表 链表的最后一个节点指向第一个节点 第一个节点是表头结构,不保存数据的。做链表有两种做法,一种是带有表头结构,一种是不带表头结构的,那么循环链表就是使用带表头结构的,表头就是一个节点,但是节点里面没有数据。空循环链表自己指向自己,空循环链表里面加入数据时就是循环链表。今天依然使用前面的做好的代码基础上写:在VS2013中新建项目,在头文件中加入MyList.原创 2016-12-26 09:40:16 · 370 阅读 · 0 评论 -
数据结构与算法(C语言版)__选择排序
在未排序的整数中找一个最小的整数,将它放在已排序的整数列表最后 要点:选择排序选最小的,往左边放。 比冒泡排序简单,交换次数少。 想象成丢手绢#include<iostream>using namespace std;void SelectSort(int *a, const int n);int main(){ int x[] = { 1, 3, 5, 7, 9, 0, 2, 4,原创 2016-12-19 16:10:29 · 423 阅读 · 0 评论 -
数据结构与算法(C语言版)__双向链表
链表有单向链表也有双向链表,双向链表既可以下一个,也可以上一个。 双向链表在一个节点里至少有三个域,左链域(llink),右链域(rlink),数据域(data)双向链表也可以做成循环链表,可以有表头结构。 今天我们做一个双向链表,但是不是循环链表:#include<iostream>using namespace std;class DblList;//class DblListNode{原创 2016-12-26 10:46:54 · 480 阅读 · 0 评论 -
数据结构与算法(C语言版)__顺序查找
顺序查找与折半查找(二分查找) 没有排序的数据:只能顺序查找 已经排序的数据:二分查找即可 顺序查找:速度慢 例如:100万个数据,平均要找50万次!#include<iostream>using namespace std;int SequentialSearch(int *a, const int n, const int x);int main(){ int m[] = { 2原创 2016-12-19 16:34:03 · 2484 阅读 · 0 评论 -
数据结构与算法(C语言版)__链式栈
用链表做的堆栈,链表可以动态的创建一些节点,在插入和删除节点方面要快很多。 先进后出栈操作: Push入栈 Pop出栈 Top返回栈顶数据在VS2013新建项目,在头文件中加入LinkedStack.h在源文件中加入main.cpp//LinkedStack.h#ifndef LINKEDSTACK_H#define LINKEDSTACK_Htemplate<class T>class原创 2016-12-26 16:31:38 · 891 阅读 · 0 评论 -
数据结构与算法(C语言版)__链式队列
用链表做的队列 先进先出 使用C++模板类 动态数组做可能会浪费空间,但是链表的利用率就比较高,今天用链表做一个队列。在VS2013中新建项目,在头文件中加入QueueLi.h在原文件中加入main.cpp//QueueLi.h#ifndef QUEUELI_H#define QUEUELI_Htemplate<class Object>class Queue{public:原创 2016-12-26 21:18:38 · 302 阅读 · 0 评论 -
数据结构与算法(C语言版)__哈希和映射
最神奇的数据结构 哈希 哈希可以用来做哈希集也可以用来做哈希映射今天我们讲一讲哈希映射 哈希也叫作散列 哈希的速度非常非常快O(1)>O(logn)>O(n)>O(nlogn)>O(n2)>O(n3)>O(2n)>O(n!)O(1)>O(logn)>O(n)>O(nlogn)>O(n^2)>O(n^3)>O(2^n)>O(n!)哈希O(1)O(1) 二叉树O(logN)O(logN) 线性原创 2016-12-31 21:07:51 · 876 阅读 · 0 评论