数据结构
吾竹清风
因为你努力了,所以时间给了财富!
展开
-
图解归并算法
#include <stdio.h>#include <malloc.h>#include <stdlib.h>/* 归并排序是一种效率较高的排序方法,它分为拆分和合并两大部分,先拆后合。 step 1 : 拆分,就是将一堆无序的数拆成单个,方便合并。 step 2 :合并(merge),就是将拆分好的数按照排序规则再拼凑起来 一个元素,可以看做是有序的,是稳定的算法*/void printArray(int array[], ...原创 2020-10-19 10:53:21 · 290 阅读 · 0 评论 -
图解快速排序优化
1、快速排序的基本思想: 快速排序使用分治的思想,通过一趟排序将待排序列分割成两部分,其中一部分记录的关键字 均比另一部分记录的关键字小。之后分别对这两部分记录继续进行排序,以达到整个序列有序的目的。 2、快速排序的三个步骤: (1)选择基准:在待排序列中,按照某种方式挑出一个元素,作为 "基准"(pivot) (2)分割操作:以该基准在序列中的实际位置,把序列分成两个子序列。此时,在基准左边的元素 都比该基准...原创 2020-10-19 10:30:46 · 367 阅读 · 0 评论 -
图解快速排序
概念原创 2020-10-13 17:21:27 · 171 阅读 · 0 评论 -
图解希尔排序(Shell Sort)
希尔排序的原理希尔排序算法是突破时间复杂度的第一批算法之一。思想:对直接插入排序改进后可以增加效率直接插入排序某些时候很高:(1)记录本身就是基本有序的,只需要少量插入工作,就可完成整个集的排序(2)记录比较少时如何让待排序的记录个数较少呢?希尔算法#include <stdio.h>#include <malloc.h>#include <stdlib.h>void knPrint(int array[], ..原创 2020-10-13 15:40:07 · 322 阅读 · 0 评论 -
冒泡排序
#include "stdio.h"#include "stdlib.h"#include "string.h"/* 难点1:相邻元素比较 难点2:冒泡的优化 判断选择法和冒泡法的方式 是关键看 是否是相邻元素比较 (选择法是从一组数据中选择最小的)*/void printfArray(int array[], int len){ int i = 0; for (i = 0; i<len; i++) { printf("%d "...原创 2020-10-10 17:43:34 · 140 阅读 · 0 评论 -
插入排序
概念思想:括号中的序列是一个有序序列#include <stdio.h>#include <malloc.h>#include <stdlib.h>void knPrint(int array[], int len){ for (int i = 0; i < len; i++) { printf("%d ", array[i]); } printf("\n");}void swap(int array[], in..原创 2020-10-10 16:18:34 · 120 阅读 · 0 评论 -
选择法排序
概念选择法思想 :在每趟中,将最小的数挑出来#include "stdio.h"#include "stdlib.h"#include "string.h"//选择法void printArray(int array[], int len){ int i = 0; for (i = 0; i<len; i++) { printf("%d\t", array[i]); } printf("\n");}void swap(int array[], int.原创 2020-10-10 16:06:06 · 135 阅读 · 0 评论 -
图解霍夫曼树-压缩算法的基础
对于文本”BADCADFEED”的传输而言,因为重复出现的只有”ABCDEF”这6个字符,因此可以用下面的方式编码: 接收方可以根据每3个bit进行一次字符解码的方式还原文本信息。这样的编码方式需要30个bit位才能表示10个字符那么当传输一篇500个字符的情报时,需要15000个bit位在战争年代,这种编码方式对于情报的发送和接受是很低效且容易出错的。如何提高收发效率?要提高效率,必然要从编码方式的改进入手,要避免每个字符都占用相同的bit位 ...原创 2020-10-09 17:27:25 · 477 阅读 · 0 评论 -
图解 二叉线索树
二叉线索树 概念 普通二叉树只能找到结点的左右孩子信息,而该结点的直接前驱和直接后继只能在遍历过程中获得。 若可将遍历后对应的有关前驱和后继预存起来,则从第一个结点开始就能很快“顺藤摸瓜”而遍历整个树了。 理解:线索化核心算法的理解类似使用2个辅助指针变量交替的挖字符串代码讲解按照严老师 增加一个头结点#define _CRT_SECURE_NO_WARNINGS#include...原创 2020-10-09 10:04:10 · 603 阅读 · 0 评论 -
树的非递归遍历(使用c语言)
#include <stdio.h>#include <string.h>#include "knLinklist.h"#include "knLinkstack.h"//二叉链表typedef struct BiNode{ int data; struct BiNode *lchild, *rchild;}BiNode, *BiTree;#if 1//找到向左走,找到中序遍历的起点BiNode *goLeft(BiNode *T, LinkStack .原创 2020-09-25 09:17:49 · 314 阅读 · 0 评论 -
图解 使用#法确定一棵树
#define _CRT_SECURE_NO_WARNINGS#include <stdlib.h>#include <string.h>#include <stdio.h>/* 1 / \ 2 3 / \ / \ 4 # # # / \ # #先序遍历 根左右124###3## 通过先序遍历124###3##可以唯一确定一棵树注意: 3## 说明3一定...原创 2020-09-24 17:39:29 · 238 阅读 · 0 评论 -
图解 如何确定一个树
原创 2020-09-24 17:36:54 · 308 阅读 · 0 评论 -
树的非递归遍历(中序遍历)
算法:#include <iostream>#include <stack>using namespace std;/* 二叉树的遍历---中序遍历非递归算法 中序 遍历的几种情况 分析1:什么时候访问根、什么时候访问左子树、什么访问右子树 当左子树为空或者左子树已经访问完毕以后,再访问根 访问完毕根以后,再访问右子树。 分析2:为什么是栈,而不是其他队列。 先走到的后访问,后走到的先访问,显然是栈结构 分析3:结点所有路径情况 .原创 2020-09-24 17:32:28 · 963 阅读 · 0 评论 -
图解树的3种遍历方式
#include <stdlib.h>#include <string.h>#include <stdio.h>//二叉链表typedef struct BiNode{ int data; struct BiNode *lchild, *rchild;}BiNode, *BiTree;#if 0/* 1、 对树的访问本质,将打印去掉,访问的逻辑是一样的,只不过是打印的时机不同, 即访问的路径是一样的,访问的时机不...原创 2020-09-22 16:00:36 · 915 阅读 · 0 评论 -
树的基本定义、二叉树的性质、树与二叉树的转换和树的表示法
#include <stdlib.h>#include <string.h>#include <stdio.h>/* 树的定义: (1)树是递归定义的 (2)m个互不相交的有限集合 术语: 根 叶子 森林 有序树 无序树 结点:树中的数据元素 结点的度:结点拥有的子树数 叶结点:度为0的结点 树的度:树中各结点的度的最大值 树的深度(高度):树中结点的最大层次(根节点算作第一层...原创 2020-09-18 17:44:05 · 289 阅读 · 0 评论 -
图解队列的链式存储
#ifndef _KN_LINKQUEUE_H_#define _KN_LINKQUEUE_H_typedef void LinkQueue;//创建链式队列LinkQueue* LinkQueue_Create();//销毁链式队列void LinkQueue_Destroy(LinkQueue* queue);//清空链式队列void LinkQueue_Clear(LinkQueue* queue);//向链式队列队尾添加一个元素int Lin...原创 2020-09-18 17:36:28 · 360 阅读 · 0 评论 -
图解队列的顺序存储
#ifndef _KN_SEQQUEUE_H_#define _KN_SEQQUEUE_H_typedef void SeqQueue;//创建线性队列SeqQueue* SeqQueue_Create(int capacity);//销毁线性队列void SeqQueue_Destroy(SeqQueue *queue);//清空线性队列void SeqQueue_Clear(SeqQueue *queue);//进队列int SeqQueue_Append...原创 2020-09-18 17:29:12 · 279 阅读 · 1 评论 -
栈的应用示例
#include "stdlib.h"#include "stdio.h"#include "string.h"#include "knLinkstack.h"#if 0//--------------------------------------------------------------------------/* 栈的应用1 应用1:就近匹配 几乎所有的编译器都具有检测括号是否匹配的能力 如何实现编译器中的符号成对检测? #include <stdio.h>.原创 2020-09-18 17:24:29 · 329 阅读 · 0 评论 -
图解栈的链式存储
#ifndef _KN_LINKSTACK_H_#define _KN_LINKSTACK_H_//使用链表的链式存储 模拟栈的链式存储typedef void LinkStack;//创建栈 相当于创建一个线性表LinkStack* LinkStack_Create();//销毁栈 相当于 销毁一个线性表void LinkStack_Destroy(LinkStack* stack);//清空一个栈 相当于 清空一个线性表void LinkStack_C...原创 2020-09-18 17:20:58 · 561 阅读 · 0 评论 -
图解栈的顺序存储
栈是一种 特殊的线性表栈仅能在线性表的一端进行操作栈顶(Top):允许操作的一端栈底(Bottom):不允许操作的一端#ifndef _KN_SEQSTACK_H_#define _KN_SEQSTACK_H_typedef void SeqStack;//创建一个线性栈SeqStack* SeqStack_Create(int capacity);//释放一个线性栈void SeqStack_Destory(SeqStack *stac...原创 2020-09-11 14:58:44 · 210 阅读 · 0 评论 -
图解双向链表
插入删除#ifndef _MY_DLINKLIST_H#define _MY_DLINKLIST_Htypedef void DLinkList;typedef struct _tag_DLinkListNode{ struct _tag_DLinkListNode *next; //后继指针 struct _tag_DLinkListNode *pre; //前驱指针}DLinkListNode;//创建双向...原创 2020-09-11 11:09:09 · 596 阅读 · 0 评论 -
循环链表的应用-约瑟夫问题
约瑟夫问题-循环链表典型应用 n 个人围成一个圆圈,首先第 1 个人从 1 开始一个人一个人顺时针报数,报到第 m 个人,令其出列。然后再从下一 个人开始从 1 顺时针报数,报到第 m 个人,再令其出列,…,如此下去,求出列顺序。 #include <stdlib.h>#include <stdio.h>#include "knCirclelist.h"#include "knDebug.h"#if 0typedef struct Va...原创 2020-09-10 16:32:28 · 297 阅读 · 0 评论 -
图解循环链表
插入的3种场景:第一种:第二种:第三种:删除的3种场景原创 2020-09-10 16:06:46 · 1022 阅读 · 0 评论 -
单链表结构与顺序存储结构优缺点比较
原创 2020-09-09 11:27:33 · 207 阅读 · 0 评论 -
图解线性表的链式存储
#ifndef _MYLINKLIST_H_#define _MYLINKLIST_H_//链表typedef void LinkList;//链表节点typedef struct _tag_LinkListNode{ struct _tag_LinkListNode *next;}LinkListNode;LinkList* LinkList_Create();void LinkList_Destroy(LinkList* list);...原创 2020-09-09 10:48:25 · 255 阅读 · 0 评论 -
图解线性表的顺序存储结构
#ifndef __KNSEQLIST_H__#define __KNSEQLIST_H__typedef void SeqList;typedef void SeqListNode;//创建线性表SeqList * SeqList_Create(int capacity);//销毁线性表void SeqList_Destroy(SeqList *list);//清空线性表void SeqList_Clear(SeqList *list);//获取线性表的长...原创 2020-09-07 16:18:05 · 1301 阅读 · 0 评论