数据结构
NTZ5bzZKdUw
这个作者很懒,什么都没留下…
展开
-
【排序算法总结】----对比常见排序算法复杂度,稳定性分析,及主要代码
学习了一些常见的排序算法,我在这里对它们进行一个梳理,我们以升序为例子。常见排序算法主要有:直接插入排序,希尔排序,选择排序,堆排序,冒泡排序,快速排序,归并排序,计数排序。稳定性:算法在实现的过程中是否会改变相同元素的相对位置,不改变则稳定。1.直接插入排序主要代码void InsertSort(int* arr, int n){ for (int i = 0; i < ...原创 2020-04-08 23:59:16 · 774 阅读 · 0 评论 -
【排序算法】----详解计数排序算法
1.概念计数排序是一种非比较排序,它适用于范围比较集中的数据处理。临时开辟一个数组,通过统计数据的个数,将数据集中,再将这个数组展开,实现排序的过程。2代码展示#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h>void CountSort(int *arr,int n){...原创 2020-04-08 16:17:29 · 518 阅读 · 0 评论 -
【排序算法】----详解快速排序算法(hoare法,挖坑法,指针法,三数取中优化)
11原创 2020-04-07 23:39:33 · 397 阅读 · 0 评论 -
【数据结构】模拟实现双向带头循环链表(头插,头删,尾插,尾删,查找,pos前插,删除pos)
List.h#define _CRT_SECURE_NO_WARNINGS 1#pragma once#include<stdio.h>#include<stdlib.h>#include<malloc.h>#include<assert.h>// 2、带头+双向+循环链表增删查改实现typedef int LTDataType;...原创 2020-04-05 22:49:05 · 232 阅读 · 1 评论 -
【数据结构】模拟实现二叉树(二叉树的实现,查找,前中后层序,深度,叶节点,K层,结点数)
1.概念1.二叉树每个结点最多有两颗子树,且有左右之分,次序不能颠倒。2.完全二叉树:K-1层结点为满,K层从左至右为连续。3.满二叉树:二叉树的结点个数为2k-1,K-1层的左右子树(叶子)为满。4.存储分为:链式和顺序。链式可以直接通过指针访问:顺序访问:若i>0,i位置节点的双亲序号:(i-1)/2;i=0,i为根节点编号,无双亲节点parent = (i-1)/2...原创 2020-04-03 15:14:00 · 248 阅读 · 0 评论 -
【数据结构】模拟实现栈
1.概念栈是一种遵循先进后出的特殊线性表。入数据只能从栈顶入,出数据只能从栈顶出。所以实现栈,通过数组实现最优,因为总是从最后一个拿出数据。2.代码展示Stack.h#define _CRT_SECURE_NO_WARNINGS 1#pragma once#include<stdlib.h>#include<stdio.h>#include<as...原创 2020-04-01 18:11:32 · 217 阅读 · 0 评论 -
【数据结构】模拟实现队列
1.2.代码展示#include"Queue.h"// 初始化队列void QueueInit(Queue* q){ assert(q); q->_front = NULL; q->_rear = NULL;}// 队头出队列void QueuePop(Queue* q){ assert(q); //只有一个元素 需要将队尾也置空 //两个 if...原创 2020-04-01 17:57:27 · 224 阅读 · 0 评论 -
【排序算法】----详解归并排序算法
1.归并排序原理,首先将数组递归的分解,直到达到终止条件返回,然后将分成两段的数组,进行比较,按从小到大的顺序放在临时数组里,然后将这一段排好顺序的数组复制给原来的数组,继续返回上一层,进行排序。直到完全完成递归。图解2.代码展示#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib.h&g...原创 2020-03-31 15:13:34 · 271 阅读 · 0 评论 -
【排序算法】----详解直接选择排序算法
1.直接选择排序思想:通过一次遍历,找出最大值,和最小值,储存它们的下标,然后将最小值和首位交换,然后将最大值和末位交换,然后将首位向后移动一位,末尾向前移动一位。然后直到首位和末尾相遇时停止,前面为小,后面为大。数组就有序了。2.代码展示#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>#include<stdlib....原创 2020-03-28 13:57:16 · 1816 阅读 · 0 评论 -
【排序算法】----详解希尔排序算法
1.希尔排序希尔排序实际上是一种插入排序的优化,希尔排序的目的是先进行预排序,使数组更加的有序,将需要排序的数组分成n/gap个大小为gap的子数组,对子树组进行插入排序。当gap等于1时,就相当于直接插入排序了。例如: 9 8 7 6 5 4 3 2 1 排升序直接插入排序需要 45次用希尔排序2.代码展示#define _CRT_SECURE_NO_WARNINGS 1#i...原创 2020-03-27 16:42:10 · 418 阅读 · 0 评论 -
【排序算法】----详解堆排序算法
1.堆排序算法(1).原理堆排序是一种选择排序,通过实现大小堆,来取出堆顶的数据,然后和最后一个交换,然后将堆的大小减一,循环这个过程直到,只有一个数据时停止。升序建大堆,降序建小堆。(2).问题:很多人会疑惑为什么要交换之后再减小堆的大小呢?难道不交换就不能筛选出我们要的极值吗?首先向下调整算法的时间复杂度为O(log n )数据一共是n个先交换再减小,堆的结构变化不大,我们只...原创 2020-03-26 19:17:50 · 2289 阅读 · 0 评论 -
【排序算法】----详解直接插入排序算法
1.直接插入排序算法。单趟排序:我们以升序为例子,简单来说就是将大数放到靠右边的位置,我们将第一个数作为当前数arr[end],将下一个数储存起来tmp=arr[end+1],然后比较下一个数和当前数的大小arr[end]?tmp,如果比当前数小,那么我们将当前数赋值给下一个数arr[end+1]=arr[end]。依次移动赋值,直到比end前面的某个数大时,停止,然然后将储存起来的数赋值给原...原创 2020-03-26 17:33:12 · 396 阅读 · 0 评论 -
【数据结构】模拟实现无头单向非循环链表(内含对指针的详细理解)
1.链表概念链表在逻辑上是线性的,但是在物理存储的过程中,不一定是线性的,它通过指针实现连续存储数据元素。结构:2.代码展示SList.h#define _CRT_SECURE_NO_WARNINGS 1#pragma once#include<stdio.h>#include<stdlib.h>#include<assert.h>// ...原创 2020-03-26 00:47:39 · 198 阅读 · 0 评论 -
【数据结构】模拟实现顺序表
1.概念及结构顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。顺序表一般可以分为:静态顺序表:使用定长数组存储。动态顺序表:使用动态开辟的数组存储。2.代码展示SeqList.h#define _CRT_SECURE_NO_WARNINGS 1#pragma once#include<stdio.h...原创 2020-03-23 15:45:32 · 153 阅读 · 0 评论 -
先序遍历 中序遍历 后序遍历 层序遍历
二叉树链式结构的遍历所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具体的应用问 题。 遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。前序/中序/后序的递归结构遍历:是根据访问结点操作发生位置命名,遍历的路径都相同,只是访问的顺序不同。NLR:前序遍历(Preorder Traversal 亦称...原创 2020-03-07 23:07:28 · 9873 阅读 · 0 评论 -
【数据结构】模拟实现堆
1.思路建堆首先要写一个向下调整算法,运用向下调整算法的条件是,左右子树是对应的堆,我们以小根堆为例子。写出向下调整算法之后,我们从叶子结点的双亲结点开始遍历i结点的双亲结点为 (i-1)/2i结点的左孩子为2i+1,右孩子为2i+2。(结点大小必须小于结点个数N)堆插入插入的时候首先要判断容量,不够要扩容,插入要插入到最后,然后比较插入的数据和双亲结点的大小,调用向上调整算法,使...原创 2020-03-02 22:16:16 · 252 阅读 · 0 评论