随笔分类 - 数据结构
摘要:排序7-堆排序 序列->完全二叉树 建立堆序(正序) /* @param arr[] 待调整数组 @param index 待调的结点下标 @param len 数组长度 */ void heapAdjust(int arr[], int index, int len){ //保存待调整结点的下标
阅读全文
摘要:排序6-归并排序 归并排序思路 每次将序列分为二组, 如果这两组数据是有序的, 在辅助空间进行排序. 细分至只有一个数据时序列是有序的, 从此开始向上合并临近小组 分组合并 //分组合并, 将要合并的两个序列按大小填入辅助空间中 void Merge(int arr[], int start, in
阅读全文
摘要:排序5-快速排序 快速排序(正序) 利用分而治之的思想+挖坑填数排序, 选择一个基准数, 将小于基准数的元素全部放在基准数左边, 大于基准数的元素全部放在基准数右侧. 对于基本无序的情况下, 快速排序的效率最好, 基本有序的情况下, 效率最差 再对剩下的部分进行快速排序 快速排序c++实现(正序)
阅读全文
摘要:排序4-希尔排序 插入排序在以下情况时效率较高 当元素序列基本有序 元素个数较少 希尔排序是对插入排序的优化 希尔排序先将元素分组(通常为总长度的一半, 例如有8个数据量, 则将数据分为4组, 每组2个数据), 然后再对每一组元素单独进行插入排序, 创造出满足上述2个条件的情况 示意(间隔为2, 分
阅读全文
摘要:排序3-插入排序 插入排序把排序对象分成已排序和未排序两个部分, 每次选取未排序部分的首元素, 将它插入已排序部分的合适部分 插入排序(正序) //插入排序 void insertSort(int arr[], int length){ int j; for(int i=1; i<length; i
阅读全文
摘要:排序2-选择排序 每次找到最值的下标, 最后交换元素, 每次遍历的元素减少. 每次遍历仅做一次元素交换, 减少了交换的次数. 性能较冒泡排序更好一点, 但时间复杂度仍是O(n^2) 交换元素 //交换 void Swap(int *a, int *b){ int tmp = *a; *a = *b;
阅读全文
摘要:排序1-冒泡排序 冒泡排序的次数是递减的, 第一次确定了最大元素的位置, 所以第二次只需要进行n-1次排列, 第二次确定了第二大元素的位置, 所以第三次只需要进行n-2次排列, 以此类推 for (int i = 0; i < len; i++){ //每次遍历的次数是递减的 //所以j=len-1
阅读全文
摘要:树4-树的确定与#号创建 只有中序遍历不能确定一个树 确定树的方法 中序遍历确定左右区域,而先序和后序确定实际位置 二叉树的#创建 二叉树结点 typedef struct BinaryNode{ char ch; struct BinaryNode *lChild; struct BinaryNo
阅读全文
摘要:树3-二叉树非递归遍历(栈) 拷贝根结点, 初始值FALSE, 入栈 弹出, 如果是FALSE, 将根节点将更新为TRUE, 其子结点(初始值FALSE)一并入栈 [A,B,C] (前序遍历, 入栈顺序:C,B,A 输出顺序: A,B,C) 再弹出, 如果是TRUE则输出 引入链式栈头文件 #inc
阅读全文
摘要:树2-二叉树拷贝, 遍历, 计算叶子结点和高度 二叉树结点 typedef struct BinaryNode{ char ch; struct BinaryNode *lChild; struct BinaryNode *rChild; } BinaryNode; //叶子结点的数量 int su
阅读全文
摘要:树1: 二叉树概念与遍历方法 二叉树 二叉树的遍历 二叉树遍历分为前序, 中序, 后序. 序是指遍历根结点的顺序 D-data, 根 L 左 R 右, 先序遍历 ABCDE-FGH 中序遍历 BDCE-A-FHG 后序遍历 DECB-HGF-A 先序遍历 ABDH-I-EJ CFG 中序遍历 HDI
阅读全文
摘要:栈5-后缀表达式的求解 求解过程 8 3 1 - 5 * + 数字:进栈 [1,3,8] 符号: - 从栈中弹出右操作数 -1 从栈中弹出左操作数 3-1 根据符号进行运算 2 将运算结果压入栈中 [2,8] 遍历结束, 栈中唯一的数字作为计算结果 定义栈结构 typedef struct MYNU
阅读全文
摘要:栈4-后缀表达式 中缀转后缀 数字: 直接输出 左括号: 进栈 运算符号: 与栈顶符号进行优先级比较 栈顶若是左括号, 优先级最低 栈顶符号优先级低: 此符号进栈 栈顶符号优先级不低, 弹出栈顶符号后进栈 右括号: 将栈顶符号弹出并输出, 知道匹配到左括号 遍历结束: 弹出并输出所有符号 自定义栈结
阅读全文
摘要:栈3: 括号匹配 自定义数据结构 typedef struct MYCHAR{ LinkNode node; char* pAddres; //数据域 int index; // } MyChar; 判断左右括号 int IsLeft(char c){ return c=='('; } int Is
阅读全文
摘要:栈2: 栈的链式存储 栈的结点 //链式栈的结点 typedef struct LINKNODE{ struct LINKNODE *next; } LinkNode; 链式栈的结构 //链式栈 typedef struct LINKSTACK{ LinkNode head; int size; }
阅读全文
摘要:栈: 顺序存储 栈是一种先进后出(First In Last Out,FILO)的数据结构 如果你将两个元素压入栈,先加入的元素将在后加入的元素之后出栈 栈顶元素值为null(未满时) 定义栈的数据结构 #define MAX_SIZE 1024 //利用数组模拟栈的顺序存储 typedef str
阅读全文
摘要:链表4-循环链表 循环链表的特点: 链表的尾结点后继指向头结点 循环链表的结构 typedef struct Node{ int data; //数据域 struct Node *nextNode; //后继 } Node; 循环链表的初始化 Node* initHeader(){ //创建头结点
阅读全文
摘要:链表3: 双链表 双链表的结构 双链表与单链表最大的不同就是不仅存储了结点的后继, 还存储了结点的前驱. 创建双链表的数据结构 typedef struct Node{ struct Node *preNode; //前驱 int data; //数据域 struct Node *nextNode;
阅读全文
摘要:链表2: 动态单链表 定义数据结构 // 定义链表数据结构 typedef struct LNode{ int data; struct LNode *next; }LNode; 初始化链表 // 初始化链表 LNode *Init_LinkList(){ //返回头指针 // 创建头结点 LNod
阅读全文
摘要:链表1: 静态单链表 单链表的结构 链表包含了数据域与指针域, 数据域存储数据, 指针域存储下一个结点的地址 链表的特点 链表的优势在于数据的删改, 在链表中查询第$i$个元素需要从第一个结点开始遍历链表,, 因此在数据的顺序读取中链表的优势不如数组. 链表的插入操作 设newNode为新节点, c
阅读全文