![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 54
Cling槑
世上无难事,只要肯攀登。
展开
-
数据结构--测试几种排序的性能对比
排序的动图演示链接 排序测试排序的性能对比 测试排序的性能对比 插入、希尔、选择、冒泡、堆、计数、归并、快速排序 void timetest() { int n; printf("数据量: \n"); scanf_s("%d", &n); srand(time(NULL)); int* arr = (int*)malloc(sizeof(int)*n); int* copy1 = (int*)malloc(sizeof(int)*n); int* copy2 = (int*)mallo原创 2021-04-11 11:48:35 · 224 阅读 · 0 评论 -
数据结构--快速排序
排序的动图演示链接 排序1. 快速排序(1)递归实现①hoare版本②挖坑法③前后指针法(2)非递归实现①利用顺序表实现②利用栈实现③利用队列实现 1. 快速排序 算法描述 ① 从序列中选择一个元素,即基准值(取第一个元素或者可以利用下面的getMid函数实现); ② 重新对序列排序,将所有小于基准值的放在基准值前面,大于的放在后面,分区操作完成; ③ 递归地将两个子序列分别排序,即排序完成; ④ 非递归可以利用顺序表/栈/队列来实现。 (1)递归实现 ①hoare版本 //返回划分之后,基准值所在位置原创 2021-04-11 11:48:04 · 338 阅读 · 0 评论 -
数据结构--堆排序、计数排序、归并排序
排序的动图演示链接 排序1. 堆排序2. 归并排序(1)递归实现(2)非递归实现3. 计数排序 1. 堆排序 (1)算法描述 ① 将初始待排序的序列构建成大堆,即为初始的无序区间; ② 将堆顶元素与最后一个元素进行交换(此时,无序区间与有序区间分别是[1,n-1]、[n]); ③ 对无序区间的序列继续建大堆,执行②,更新无序区间和有序区间; ④ 重复③,直至有序区间的元素个数为n-1个,则数据有序。 (2)代码实现 //堆排序 时间复杂度:O(n(logn)) 不稳定 //建大堆,从最后一个 void原创 2021-04-11 11:47:05 · 216 阅读 · 0 评论 -
数据结构--插入、希尔、选择、冒泡排序
排序1.插入排序2.希尔排序3.选择排序4.堆排序5.冒泡排序6.快速排序(1)递归实现①hoare版本②挖坑法③前后指针法(2)非递归实现①利用顺序表实现②利用栈实现③利用队列实现7.归并排序(1)递归实现(2)非递归实现8.计数排序9.测试排序的性能对比 1.插入排序 2.希尔排序 3.选择排序 4.堆排序 5.冒泡排序 6.快速排序 (1)递归实现 ①hoare版本 ②挖坑法 ③前后指针法 (2)非递归实现 ①利用顺序表实现 ②利用栈实现 ③利用队列实现 7.归并排序 (1)递归实现 (2)非递归实现原创 2021-01-28 22:43:28 · 258 阅读 · 0 评论 -
数据结构--二叉树leetcode题
二叉树题 1.单值二叉树965 如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。只有给定的树是单值二叉树时,才返回 true;否则返回 false。 链接:https://leetcode-cn.com/problems/univalued-binary-tree bool _isUnivalTree(struct TreeNode* root,int val){ if(root) { return root->val == val &&原创 2021-01-17 16:15:49 · 283 阅读 · 0 评论 -
数据结构--二叉树
树:一种非线性的数据结构,由n(n>=0)个有效结点组成的一个具有层次关系的集合;原创 2021-01-17 10:24:06 · 2028 阅读 · 1 评论 -
数据结构--堆
堆:如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储。在一个一维数组中,并满足:Ki <= K2i+1 且 Ki<= K2i+2 (Ki >= K2i+1 且 Ki >= K2i+2) i = 0,1,2…,则称为小堆(或大堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。 ...原创 2021-01-15 23:53:54 · 243 阅读 · 0 评论 -
数据结构--循环队列
设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。 你的实现应该支持如下操作: MyCircularQueue(k): 构造器,设置队列长度为 k 。 Front: 从队首获取元素。如果队列为空,返回 -1 。原创 2021-01-14 22:35:10 · 387 阅读 · 0 评论 -
数据结构--栈和队列
栈(stack) (1)栈:一种特殊的线性表,只允许在固定的一端进行插入和删除元素操作; (2)栈顶:进行数据插入和删除操作的一端; (3)栈中的数据元素遵守后进先出原则(LIFO); (4)压栈:栈的插入操作; (5)出栈:栈的删除操作; (6)栈的实现:初始化栈、入栈、出栈、取栈顶元素、获取栈中元素个数、栈的判空、销毁栈。 //支持动态增长的栈 typedef int STDataType; typedef struct Stack { STDataType* _a; int _top; .原创 2021-01-13 20:46:13 · 222 阅读 · 0 评论 -
数据结构--链表
链表 链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 常用的两种链表结构:无头单向非循环链表和带头双向循环链表。 链表的特点: (1)进行插入、删除时,不需要移动表中元素; (2)不必事先估计存储空间; (3)所需空间与线性表长度成正比。 带头双向循环链表增删查改的实现: // 带头+双向+循环链表增删查改实现 typedef int LTDataType; typedef struct ListNode { LTDataTy原创 2021-01-11 23:26:13 · 430 阅读 · 0 评论