![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
漆黑的莫莫
这个作者很懒,什么都没留下…
展开
-
循环赛日程安排问题(分治法)
问题描写叙述:设有n(n=2^k)支队伍參加循环赛,循环赛共进行n-1天,每支队伍要与其它n-1支队伍比赛一场,且每支队伍每天必须比赛一场,不能轮空。试按此要求为比赛安排日程。算法思路: 我们先安排奇数下标位置与偶数下标位置之间的比赛,就有n/2场,方法非常easy, team[2k]=2k,全部奇数号组成一个序列[1,3...n-1], 然后循环移动n/2-1次(比方第2个序列就是[3,5...n-1,1]), 然后将该序列填充在team的奇数位置上。 接下来将队伍原创 2021-12-24 20:19:15 · 2337 阅读 · 0 评论 -
希尔排序(步长折半)
#include<stdio.h>void shell_sort(int arr[],int length);int main(){ int arr[20]; int i; for (i = 0; i < 20; i++) { arr[i] = 20 - i; } shell_sort(arr, 20); for (i = 0; i < 20; i++) { printf("%4d ", arr[i]); if ((i + 1) % 10 ==原创 2021-01-05 10:15:13 · 357 阅读 · 0 评论 -
归并排序(递归实现)
#include<stdio.h>int merge(int data[], int low, int mid, int high, int space[]);int merge_sort(int data[], int low, int high, int space[]);int MergeSort(int arr[], int length);int main(){ int arr[20]; for (int i = 0; i < 20; i++) { arr原创 2021-01-02 22:16:40 · 158 阅读 · 0 评论 -
排序算法中,某一趟结束后未必能选出一个元素放在其最终位置上
简单选择排序,能够取出当前无序序列中最(小or大)值与第一位置的元素互换位置。堆排序每趟总能选出一个最值位于根节点。冒泡排序总是两两比较选出一个最值位于数组前面。快速排序选出的枢轴在一趟排序中就位于了它最终的位置插入排序(直接、二分)不一定会位于最终的位置,因为不确定后面插入的元素对于前面的元素是否产生影响。希尔排序(本质也是插入排序)只在子序列中直接插入排序。所以不能确定。二路归并排序除非在缓存区一次放入所有的序列(这样得不偿失),否则不能确定最终位置。所以能够在一趟结束后,就选出一个元素在转载 2020-12-27 16:28:43 · 17591 阅读 · 3 评论 -
模板_图
#include<iostream>#include<queue>#include<stack>using namespace std;template<class numtype>class Graph; //图类的声明template<class numtype>class AdjVNode //邻接点类的定义{ public: AdjVNode(int num):index_value(num), next(NULL)原创 2020-12-19 14:52:39 · 83 阅读 · 1 评论 -
模板_队列
#include<iostream>using namespace std;template<class numtype>class LinkQueue{ public: LinkQueue(int max_size = 50); ~LinkQueue(); bool EnterQueue(numtype x); //声明 入队 函数 bool DeleteQueue(numtype *x); //声明 出队 函数 bool IsEmpty(); //原创 2020-12-19 14:51:51 · 103 阅读 · 1 评论 -
平均查找长度(散列 顺序 二分)
以学生班级 姓名作为信息,进行平均查找长度的演示#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>#define STUDENTS_SUM 30 //学生总数#define HASH_TABLE_SIZE 40 //哈希表长度#define MAX_PRIME 37 //小于等于哈希表长度大于元素个数的最大素数typedef struct student原创 2020-12-12 15:52:30 · 1416 阅读 · 0 评论 -
为什么事件的最早发生时间是源点到顶点的最长路径长度?(关键路径详解)
在学习数据结构的过程中,我发现关键路径的中的概念取名使得第一印象让人容易产生误解,所以我用最通俗易懂的例子来解释解释这些概念的实际含义。基本概念——AOE网有几个最基本的概念我们要先了解,在带权有向图中,顶点表示事件,有向边表示活动,以边上的权值表示活动的开销,比如完成活动所需要的时间。这样的网络称为用边表示活动的网络,也就是AOE网。分清发生和开始这里要首先弄明白的是两个词,也就是后面要学到的概念中的 “发生” 和 “开始”。“发生”是针对于事件的,也就是图中的顶点。什么叫事件发生了呢?只有在转载 2020-11-30 20:20:04 · 10634 阅读 · 28 评论 -
BFS与DFS
邻接矩阵存储图的DFS与BFS#include <stdio.h>#include<stdlib.h>typedef enum {FALSE, TRUE} BOOL;#define MaxVertexNum 10 /* 最大顶点数设为10 */#define INFINITY 65535 /* ∞设为双字节无符号整数的最大值65535*/typedef char Vertex; /* 用顶点下标表示顶点,为字符型 */typedef int Weigh原创 2020-11-29 17:14:03 · 160 阅读 · 0 评论 -
模板_栈
#include<iostream>using namespace std;template<class numtype>class LinkStack{ public: LinkStack(); ~LinkStack(); bool Push(numtype x); //声明 压栈 函数 bool Pop(numtype *x); //声明 弹栈 函数 bool IsEmpty(); //声明 判空 函数 bool IsFull(); //声明原创 2020-11-21 22:17:32 · 82 阅读 · 0 评论 -
模板_树
#include<iostream>using namespace std;template <typename T>struct BSNode{ //初始化 只赋予权值 BSNode(T t):value(t),lchild(NULL),rchild(NULL) {} //BSNode() = default; T value; //节点的值 BSNode<T>* lchild; //左孩子原创 2020-11-21 22:15:17 · 120 阅读 · 1 评论 -
建立二叉树(用二叉链表存储),并进行遍历
问题描述:建立一棵用二叉链表方式存储的二叉树,并对其进行遍历(先序、中序和后序),打印输出遍历结果。基本要求:从键盘输入先序序列,以二叉链表作为存储结构,建立二叉树(以先序来建立)并对其进行遍历(先序、中序、后序),然后将遍历结果打印输出。`在这里插入代码片`要求采用递归和非递归两种方法实现。输入样例:ABC**DE*G**F***输出样例:先序:ABCDEGF中序:CBEGDFA后序:CGEFDBA递归实现:#include<stdio.h>#includ原创 2020-11-20 21:14:55 · 37727 阅读 · 22 评论 -
哈夫曼编码与解码
纪念我逝去的三天时间:被 堆溢出 这个Bug困扰了许久,甚至开始怀疑编译器有问题在经历了艰难险阻后 (其实最后发现只是少写个 1终于解决了问题代码如下:#include<stdio.h>#include<stdlib.h>#include<string.h>typedef struct HFM_Tree_Node{ double weight; //用来存放各个结点的权值 unsigned int parent, LChild, RChild;原创 2020-11-19 12:33:06 · 732 阅读 · 3 评论 -
KMP 算法
#include<stdio.h>#include<stdlib.h>int KMP(char *str, int len_s, char *ptr, int len_p);int Cal_Next(char *ptr, int len, int *next);int main(){ char *str = "bacbababadababacambabacaddababacasdsd"; char *ptr = "ababaca"; int a =原创 2020-10-18 20:23:23 · 706 阅读 · 0 评论