数据结构与算法
毕业季的迷茫
IT小虾
展开
-
KMP算法
void BuildMatch(char* pattern, int* match){ int i, j; int m = strlen(pattern); match[0] = -1; for (j = 1; j < m; j++) { i = match[j - 1]; while ((i >= 0) && (pattern[i + 1] != pattern[j])) i = match[i]; if (pattern[i + 1] == .原创 2021-02-22 20:33:24 · 71 阅读 · 0 评论 -
树(堆、哈夫曼树)
一、堆优先队列(Priority Queue): 取出元素的顺序是依照元素的优先权大小,而不是元素进入队列的先后顺序。优先队列的完全二叉树表示就形成了堆。堆的特性:(1) 结构性:用数组表示的完全二叉树(2) 有序性:任一节点的关键字是其子树所有节点的最大值(或最小值)1.1 最大堆的创建typedef struct HeapStruct* MaxHeap;struct HeapStruct{ ElelementType* Elements; /*存储堆元素*/ int Size;原创 2021-02-22 20:33:13 · 160 阅读 · 0 评论 -
树(二叉搜索树/平衡二叉树)
一、二叉搜索树(BST)二叉搜索树(Binary Search Tree),也称二叉排序树或二叉查找树。二叉搜索树:是一颗二叉树,可以为空;若不为空,满足一下性质:(1) 非空左子树的所有键值小于其根节点的键值(2) 非空右子树的所有键值大于其根节点的键值(3) 左右子树都是二叉搜索树1.1 二叉搜索树操作的常用操作Position Find(ElementType X, BinTree BST); // 从二叉搜索树种查找元素X 并返回所在节点的地址Position FindMin原创 2021-02-22 20:33:01 · 146 阅读 · 0 评论 -
树(术语, 表示, 二叉树)
1. 树的基本术语1.1 节点的度(Degree): 节点的字数个数1.2 树的度: 树的所有节点中最大的度数1.3 叶节点(Leaf): 度为0的节点1.4 父节点(Parent): 有子树的节点是其子树的根节点或父节点1.5 子节点(Child): 若A节点是B节点的父节点, 则称B节点是A节点的子节点,或孩子节点1.6 兄弟节点(Sibling): 具有统一父节点的各个节点彼此是兄弟节点1.7 路径和路径长度: 从节点N1到Nk的路径为一个节点序列N1,N2, ..., Nk,Ni是N原创 2021-02-20 16:29:46 · 457 阅读 · 0 评论 -
二分查找 BinarySearch
二分查找的时间复杂度是O(logN)二分查找的先决条件是:查找的序列是排好序的,例如从小到大顺序排好的数组下面就是按照从小到大排好序的整形数组给出的例子typedef int ElementType;typedef int* Table;typedef int Position;/*在表中查找值为K的元素,返回下标*/Position BinarySearch( Table tbl, ElementType K, int Length){ int left=1, right=Lengt原创 2021-02-20 16:21:37 · 83 阅读 · 1 评论 -
表、栈、队列
1. 表 List1.1 List ADTstruct Node;typedef struct Node* PtrToNode;typedef PtrToNode List; // 通常用一个节点来代表一个空表typedef PtrToNode Position;typedef int ElementType;List MakeEmpty( List L );int IsEmpty( List L);int IsLast(Position P, List L);Position原创 2021-02-20 16:20:43 · 197 阅读 · 0 评论 -
排序算法的比较
排序方法 平均时间 最坏情况 辅助空间简单排序 O(N^2) O(N^2) O(1)快速排序 O(NlogN) O(N^2) O(logN)堆排序 O(NlogN) O(NlogN) O(1)归并排序 O(NlogN) O(NlogN) O(n)基数排序 O(d(n+rd)) O(d(n+rd)) O(rd)(1) 从平均性能而言, 快速排序最佳,但在最坏情况下时间性能不如堆排序和归并排序。而后两者比较的结果是,在n较大时,归并速度更快,但空间消耗多(2) "简单排.原创 2021-02-20 16:16:14 · 109 阅读 · 0 评论 -
快速排序
快速排序 Quick Sort是对起泡排序的一种改进。它的基本思路是,通过一趟排序将带排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对两部分记录继续进行排序,以达到整个序列有序。如何将序列分成两个部分?(1) 在序列中任取一个记录作为枢轴(支点 pivot)(2) 重新排列其余记录[1] 将所有比它小的记录都安置在它的位置之前,比它打的记录在它之后[2] 由此,该枢轴记录最后所落在的位置i作为分界线,将序列分割两部分快速排序的pivot选取是使得排序变原创 2021-02-20 16:14:05 · 163 阅读 · 0 评论 -
归并排序
归并排序Merging Sort1. 稳定2. 需要开辟辅助空间, 因而基本不会用在内部排序中, 反而常用于外排序将两个或两个以上的有序表组合成一个新的有序表。二路归并过程描述:初始: 49 38 65 97 76 13 27一趟归并之后: (38 49) (65 97) (13 76) (27)两趟归并之后: (38 49 65 97) (13 27 76)三趟归并之后: (13 27 38 49 65 76 97)核心操作是将一维数组中前后相...原创 2021-02-20 16:12:08 · 200 阅读 · 0 评论 -
堆排序
1. 堆排序Heap_Sort算法1.1void Heap_Sort( ElementType A[], int N ){ BuildHeap( A ); /*创建最小堆, 时间复杂度O(N)*/ /*TmpA 是存放排序结果的临时数组*/ /*DeleteMin 从最小堆里找到最小元素弹出*/ for( i=0; i<N; i++ ) TmpA[i] = DeleteMin(A); /*O(logN)*/ /*把数据还原到数组A*/ for( i=0; i<N; i+原创 2021-02-20 16:08:09 · 144 阅读 · 0 评论 -
简单排序(冒泡、插入、选择)
1. 冒泡排序 Bubble_Sort假定有一组序列:12 32 9 89 12 21需要将其排成非递减的序列, 执行一趟排序的操作是:从头到尾扫描一遍, 发现第i个元素比第i-1个元素大, 则交换两个元素。执行一趟之后,最大的元素必将排到最后。剩下的N-1个元素,重复执行排序。算法1.1 原始冒泡排序void Bubble_Sort( ElementType A[], int N ){ for ( p=N-1; P>=0; P-- ) { for ( i=0; i<原创 2021-02-20 15:56:32 · 149 阅读 · 0 评论 -
利用堆栈进行表达式求值
基本策略:将中缀表达式转换为后缀表达式,然后求值中缀表达式转换为后缀表达式的流程:从头到尾读取中缀表达式的每个对象,对不同的对象按不同的情况处理(1) 运算数:直接输出(2) 左括号:压入堆栈,入栈前左括号的优先级最高, 入栈之后其优先级降到最低(3) 右括号:将栈顶的运算符弹出并输出,直到遇到左括号(出栈,不输出)(4) 运算符: [1] 若优先级大于栈顶运算符时,则把它压栈 [2] 若优先级小于栈顶运算符时,将栈顶运算符弹出并输出;再比较新的栈顶运算符,直到该运算符大于栈顶运...原创 2021-02-20 15:48:38 · 1141 阅读 · 1 评论