数据结构与算法
单纯防止自己忘记
老黑675
这个作者很懒,什么都没留下…
展开
-
查找——字典树TrieTree
字典树 多个字符串进行反复查找 单词查找 单词计数 单词排序 核心思想 创建字典树,之后进行查找,一定非空树,节点中无字符,以下边结点代表上面节点的下标,一种单词中字符共用的思想 代码 #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct sNode { int nCount; struct sNode ** arrchar; }TireTree; TireTree * addN原创 2022-01-10 18:28:18 · 167 阅读 · 0 评论 -
查找——Sunday
Sunday 相当于strstr函数,功能强于KMP 核心思想 谁跟头比标记谁,在主串上只能出现在以一个不同的位置之后的匹配串的长度上,通过从右向左的对齐的方式 移动子串 找到等长的下一个在子串中出现的位置,使用哈希查找,使用255字符哈希 先对匹配串处理 next 数组 下一次佩的位置 k + len - next[主[k + len]] 代码 #include<stdio.h> #include<stdlib.h> #include<string.h> int原创 2022-01-10 18:27:45 · 114 阅读 · 0 评论 -
查找——哈希查找HashSearch
哈希查找 对无序数据,进行重复查找 基本思想 散列查找 散列即分组,按照某一特征进行查找,按照某种特征处理好——建立哈希表 创建哈希比表 确顶哈希散列函数(创建之前确定)——求整取余法 p = key%M (M <= n ) 有M组 定解决哈希冲突的办 a. 开放地址法(线性探测(+1)、线性补偿探测(定间隔)->线性探测在散列(间隔改变 + - i * i) 、随机探测)——去其他位置探测存储 b. 拉链法——发生冲突就生成链表 基于哈希表进行查找——利用指针数组 实现 定义结构体 申原创 2022-01-10 18:26:58 · 343 阅读 · 0 评论 -
排序——桶排序BuckerSort
桶排序 使用场景 真正的桶排序在给小数排序的 排序区间 小数位数相等 [ 0 , 1) 核心思想 将数据分组,各组内在进行排序 实现: 给位数相同的数据进行分组(按照高位) 个组内进行排序 代码 #include<stdio.h> #include<stdlib.h> /*桶排序*/ typedef struct Date { int nValue; struct Date * pNext; }Bucket; Bucket ** CreateBucket(int arr原创 2022-01-10 18:24:18 · 122 阅读 · 0 评论 -
排序——基数排序RadixSort
基数排序 LSD低位优先: 从低位开始分组,高位相同的自动有序 MSD高位优先 核心思想 LSD 使用分组的思想,分析数字之间的规律,先按照个位分组(需要尾添加),高位在低位的基础之上,进行在分组,直至最高为,利用数字的排序,是非比较的排序 找最大值 最大值的位数 按位入桶 释放 代码 #include<stdio.h> #include<stdlib.h> /*LSD*/ typedef struct Date { int nValue; struct Date * pNe原创 2022-01-10 18:23:58 · 123 阅读 · 0 评论 -
排序——选择排序SelectSort
选择排序 核心思想(简单选择排序) 每一趟找到最大的或者最小的放到对应的位置上 代码 void SelectSort1(int arr[],int nlength) { if(arr == NULL || nlength <= 0) return; int i; int j; int nMin; // 趟数 for(i = 0 ; i < nlength - 1 ; i ++ ) // 每一趟默认下标为0的树是最小的 { //遍历 nMin = i; for(j =原创 2022-01-10 18:21:36 · 175 阅读 · 0 评论 -
查找——KMP
KMP 使用场景 字符串查找,在一个字符串中查找另一个字符串,首次出现的首地址。 核心思想 主串不回头,匹配串移动,不回头利用额外的空间,在子串的跟主串不同地方找前面重复的部分(即字符串的前坠,和后缀):以字符串开头为开头,以后缀为结尾结尾的子串,找后缀与前缀最长的相同子串 重点:Next数组 装开始到匹配串任意一个字符之前 子串前缀后缀最大匹配长度,以空间换时间 根据匹配串生成next数组——数组默认从零开始,记录长度,前一个为零时从头开始比较,和前面那个数的下一个进行比较,和前面不相同的地方同等对待原创 2020-09-20 10:03:38 · 60 阅读 · 0 评论 -
排序——插入排序InsertSort
插入排序 核心思想 将待排序数据分成两部分,一部分有序,一部分无序,将无序部分依次插入到有序部分 代码 void InsertSort(int arr[],int nlength) { if(arr == NULL || nlength <= 0) return; //默认第一个元素有序 //没有交换只有放入 有倒叙遍历有序数组的过程 int i; int j; int Temp; // 趟遍历无序元素(默认有序数组为空-1位置) for(i = 0 ; i < nlength原创 2020-09-09 16:35:18 · 172 阅读 · 0 评论 -
排序——计数排序CountSort
计数排序CountSort 核心思想 代码原创 2020-09-09 16:27:00 · 131 阅读 · 0 评论 -
查找——二分查找BinaryChop
二分查找 应用场景 对有序数组进行查找 核心思想 每一次都将查找区间缩减为原来的一半 代码 #include<stdio.h> /*二分查找*/ int BinaryChop(int arr[],int nlength,int nValue) { int left = 0; int rigth = nlength - 1; int mid; while(left <= rigth) { mid = left + (rigth - left)/2; if(arr[mid]原创 2020-09-09 16:23:00 · 107 阅读 · 0 评论 -
排序——希尔排序ShellSort
希尔排序 应用场景 元素多的时候还想用插入排序 核心思想 高级插入排序 分组思想 非连续有间隔的分组 间隔分组 插入排序 在间隔分组分组,直至间隔为0分为一组 间隔按一定规律变换 步骤:1. 定间隔 for(nGap = nlength/2;nGap>0;nGap/=2) 2. 间隔分组 for(i = 0 ; i < nGap ; i ++) 3. 个组插入排序 for(j = i + nGap ; j < nlength ; j +=nGap) 代码 #include<s原创 2020-09-09 16:20:42 · 74 阅读 · 0 评论 -
排序——快速排序QuickSort
快速排序 核心思想 优化思想 代码原创 2020-09-09 16:19:41 · 100 阅读 · 0 评论 -
排序——归并排序MergeSort
归并排序 核心思想 将多个有序数组进行合并 有两路 三路 五路合并(分治思想) 非原地排序 代码 #include<stdio.h> #include<stdlib.h> /*归并排序*/ void Merge(int arr[],int left,int right) { int nlength = right - left + 1; int mid = left + (right - left)/2; int left1 = left; int right1 = mi原创 2020-09-09 16:18:44 · 155 阅读 · 0 评论 -
排序——堆排序HeapSort
堆排序 应用场景 找前N大或小的数 核心思想 特殊的选择排序 堆 本质上是数组,逻辑上是完全二叉树,遵顼父亲 左孩子 右孩子是三个 值中最大的或最小的 (左右大小无关)有大根堆 和 小根堆之分 逻辑上利用 2i + 1 2i +2 n/2 -1 注意调整函数的影响:影响和根结点交换的子节点 建造堆——调整父亲节点 堆排序——堆顶和最后一个元素交换,调整堆顶 代码 未简化 #include<stdio.h> #include<stdlib.h> #define LEFT 2原创 2020-08-31 18:39:17 · 125 阅读 · 0 评论