![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
C/数据结构
学习之路
Xn.er
你可以放弃,但坚持下来一定很酷。
展开
-
什么是AVL树?AVL树的插入,旋转及验证(代码实现)
前文说到了二叉搜索树一般情况下有很高的查找效率,平均时间复杂度为O(logN),N为树中的全部节点数。但是二叉搜索树也有缺陷,假如往树中插入的元素有序或者接近有序,二叉搜索树就会退化成单支树,时间复杂度会退化成O(N),这就很不稳定了。那么有没有更好的二叉搜索树呢?一、什么是AVL树两位俄罗斯的数学家G.M.Adelson-Velskii和E.M.Landis在1962年发表了一种解决上述问题的方法:当向二叉搜索树中插入新结点后,如果能保证每个结点的左右子树高度之差的绝对值不超过1(需要对树中的结点进行原创 2020-07-03 08:55:15 · 294 阅读 · 0 评论 -
什么是二叉搜索树?二叉搜索树的查找、插入、删除实现
一、什么是二叉搜索树二叉搜索树(Binary Search Tree)又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:(1)若它的左子树不为空,则左子树上所有节点的值都小于根节点的值(2)若它的右子树不为空,则右子树上所有节点的值都大于根节点的值(3)它的左右子树也分别为二叉搜索树二叉搜索树拥有很高的查找效率,树中最左节点为最小元素,最右节点为最大元素二、二叉搜索树的实现(查找、插入、删除)代码如下:#include<iostream>using namespac原创 2020-07-02 01:09:37 · 256 阅读 · 0 评论 -
排序算法(三) 之冒泡排序、快速排序
冒泡排序冒泡排序的原理:比较相邻的元素,如果前一个比后一个大(小),就交换他们两个。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。这样下去,最后的元素应该会是最大(小)的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。void BubbleSort(int* a, int n){ for (int end = n - 1; end > 0; --end) { int flag = 0; for原创 2020-05-27 11:38:15 · 188 阅读 · 0 评论 -
排序算法(二) 之选择排序、堆排序
选择排序首先在待排序序列中找到最小(大)数据, 存放到排序序列的起始位置, 然后, 再从剩余未排序数据中继续寻找最小(大)数据, 然后放到已排序序列的末尾. 以此类推, 直到所有数据均排序完毕void SelectSort(int* a, int n){ int begin = 0; int end = n - 1; while (begin < end) { // 在[begin, end]选出一个最小的数和一个最大的数下标 int minindex = begin, maxi原创 2020-05-23 18:52:30 · 167 阅读 · 0 评论 -
排序算法(一) 之插入排序、希尔排序
插入排序插入排序, 也被称为直接插入排序. 每一步将一个待排序的数据插入到之前已经排好序的序列中, 并保持依然有序, 直到插完所有数据void InsertSort(int* a, int n){ for (int i = 0; i < n - 1; ++i) { // 在有序区间[0, end]中插入num int end = i; int num = a[end + 1]; while (end >= 0) { if (a[end] > num)原创 2020-05-23 17:22:29 · 208 阅读 · 0 评论 -
C/数据结构 -堆(Heap)的实现
现在有一个数组, 逻辑上可看做一颗完全二叉树. 堆(Heap) 就是用数组实现的完全二叉树堆分为两种: 大根堆和小根堆在大根堆中, 父节点的值比每一个子节点的值都要大; 在小根堆中, 父节点的值比每一个子节点的值都要小这里将用代码创建一个小根堆代码如下:头文件Heap.h#pragma once#include <stdio.h>#include <string.h>#include <malloc.h>// 定义堆的结构typedef int原创 2020-05-19 23:14:14 · 280 阅读 · 0 评论 -
C语言实现栈和队列
头文件stack.h#pragma once#include<stdio.h>#include<stdlib.h>#include<assert.h>typedef int STDataType;typedef struct Stack{ STDataType* _a; int _top; //栈顶 int _capacity; //栈的容量}Stack;// 初始化栈void StackInit(Stack* pst){ pst-原创 2020-05-14 11:08:42 · 257 阅读 · 0 评论 -
C语言实现带头双向循环链表
头文件List.h#pragma once#include<stdio.h>#include<malloc.h>#include<assert.h>//带头双向循环链表增删查改typedef int LTDataType;typedef struct ListNode{ LTDataType _val; struct ListNode* _next; struct ListNode* _prev;}ListNode;ListNode* Li原创 2020-05-13 18:45:10 · 371 阅读 · 0 评论 -
实现单链表的增删查改
头文件SList.h#pragma once#include<stdio.h>#include<malloc.h>#include<assert.h>typedef int SLDataType;typedef struct SListNode{ SLDataType val; struct SListNode* next;}ListNode;ListNode* SetListNode(SLDataType x); //动态申请一个节点原创 2020-05-11 15:47:56 · 199 阅读 · 0 评论 -
实现顺序表的增删查改
线性表分为两种: 顺序表(顺序存储)和链表(链式存储), 这里实现一下顺序表管理数据的增删查改操作头文件自定义头文件中一般存放自定义函数的函数声明SqList.h#pragma once#include<stdio.h>#include<assert.h>#include<stdlib.h>typedef int SqLDataType;typedef struct SeqList{ SqLDataType* a; size_t size; s原创 2020-05-10 11:08:04 · 407 阅读 · 0 评论