![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
choudan8888
给未来一个机会
展开
-
实现C++中的Vector
Vector使用模板实现的,里面不仅包含了常用的增删改查,而且包含了迭代器;除了常用的数据类型可以使用之外,自定义的数据类型也可以使用。一下是代码:#include<iostream>#include <stdio.h>#include<assert.h>#include <conio.h>#include<algorithm>#include<vector>using namespace std;tem...原创 2020-09-23 13:49:28 · 99 阅读 · 0 评论 -
常见排序算法的使用场景和时间复杂度
排序算法的思想冒泡排序思想:从第一个待排序的数开始,和相邻的数两两比较,如果是由小到大的话就和遇到的小的交换,然后继续和后面的比较,直到所有的数据都有序,这样的话最大的数就会浮现到后面去。就像喝汽水时气泡上升的过程。时间复杂度:O(n^2) 最好的时间复杂度O(n) 空间复杂度:O(1)稳定性:稳定查看代码请点下面链接https://blog.csdn.net/ch...原创 2019-08-30 14:17:47 · 787 阅读 · 0 评论 -
红黑树和AVL树的比较
红黑树和AVL树都是从二叉搜索树进化而来的平衡二叉树。AVL树的特点一个节点的左右子数的高度差不大于1 一个节点的左右子数都是平衡二叉树 平衡二叉树满足二叉树所有的特点AVL树的时间复杂度一颗n个结点的AVL树的平均搜索复杂度是O(logn) 一颗n个结点的AVL树删除一个结点做平衡旋转的时间复杂度是O(logn) 一颗n个结点的AVL树插入一个结点做平衡旋转的时间复杂度是O...原创 2019-08-29 22:29:14 · 1812 阅读 · 1 评论 -
AVL树(平衡二叉搜索树)
为什么出现平衡二叉树树?二叉搜索树查摘和插入的思想和二分查找相似,可以很快的找到目的结点,查找所需的最大次数等同于二叉搜索树的高度。插入的时候也是一样,通过一层一层的比较,最后找到合适的位置。但是,二叉搜索树也有缺点,当需要插入的是一个基本有序或者有序的的序列时,二叉搜索树就会大大降低效率,就如同一个链表一样。插入后的二叉搜索树就会成下面这样,查找的速度和链表差不多所以这...原创 2019-08-29 11:32:26 · 149 阅读 · 0 评论 -
二叉树搜索树详解
二叉搜索树的特点二叉搜索树:二叉树的每一个结点最多有两个子数的树结构,也就是说除了叶子结点,其余结点最多有两个子节点二叉搜索树的性质若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉搜索树二叉搜索树的时间复杂度增:循环遍历每个节点,比较各节点的值,直到找到相应位置,时间...原创 2019-08-29 10:47:57 · 606 阅读 · 0 评论 -
堆排序
堆排序堆有两种分类,一种是大根堆,一种是小根堆;大根堆父亲节点的值均大于孩子结点的值 构建的这个堆必须是满二叉树小根堆父亲结点的值均小于孩子节点的值 构建的堆必须是满二叉树思想:我们首先必须构建出堆;把数字先像二叉树一样排列好,如下:接下来我们需要调整成为大根堆,从0号位置开始和它的子节点c1和c2比较,和它们中最大的换,接续和下面的孩子比较,如果比孩子小,继续换,...原创 2019-08-27 12:18:25 · 137 阅读 · 0 评论 -
找数组中前K小或者前K大
思路:我们在这里用到一个快排的思想,快排一次得到位置pos,在这个pos之前的数据全比和比较的数小(或者大),它后面的数全比和比的数大(或者小),如下图,快排第一次用6来和其他数比较,排序一次之后,在6之前的数字一定会比6小,在6之后的数字一定会比6大。如果你要找第3小则需要在6前面找,就要执行quicksort(arr, left, index, k);反之,找第7小的话,就需要在6后面...原创 2019-08-14 19:55:22 · 271 阅读 · 0 评论 -
排序之冒泡排序和选择排序
1.冒泡排序法思想:将待排序数据按照顺序一次两两比较,将较大的数据依次向后移动时间复杂度:最坏:O(n^2) 最好 :O(n) 平均 :O(n^2) 空间复杂度:O(1)稳定性:稳定(如果a在b的前面,而a=b,排序之后a仍然在b的前面就是稳定;相反的,排序后a在b的后面就是不稳定)C语言中代码示例如下:#include <stdio.h>voi...原创 2018-11-27 21:56:41 · 219 阅读 · 0 评论 -
两个栈实现一个队列和两个队列实现一个栈
1.两个栈实现一个队列在这里我们先说明一下,我们在此代码中用到的栈和队列都是STL库中实现的思路:两个栈,stark1和stark2,将stark1作为存储空间,stark2作为零时缓存区。入队时,将入队元素全部压入stark1中即可。出队时,将stark1中的元素全部pop出来压入stark2中,然后在全部pop出来就,下面来看一下代码:class Queue{public...原创 2019-01-12 17:35:43 · 121 阅读 · 0 评论 -
快速排序
快速排序的基本思想:通过一趟排序算法将待排序的数据分割成独立的两个部分,其中一部分数据的关键字均比另一部分的关键字小,则可以分别对这两端数据今次昂排序,以达到整个序列有序。详细描述:从数列中挑出一个元素,称为“基准” 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准大的摆在基准的后面。在这个分区退出后,该基准就处于数列的中间位置。 递归(或非递归)把小于基...原创 2019-01-17 16:51:31 · 178 阅读 · 0 评论 -
排序之插入排序法
算法描述:插入排序算法是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应的位置插入详细描述:从第一个元素开始,该元素可以认为已经被排好序; 取出下一个元素,在已经排序的元素中从后向前扫描; 如果该元素大于新元素,将该元素移到下一位置; 重复上一步步骤,直到找到已排序的元素或者等于新元素的位置; 将新元素插入到该位置后,重复...原创 2019-01-17 17:33:19 · 139 阅读 · 0 评论 -
希尔排序
希尔排序是简单插入排序的改进版,它与插入排序的不同在在于希尔排序会优先比较距离较远的元素。思想:选择以恶增量序列t1,t2,...tk,其中ti>tj,tk = 1; 按增量序列个数k,对其进行k躺排序 每趟排序,根据对应的增量ti,将待排序列分为若干长度为m的子序列,分别对个子表进行直接插入排序。增量因子为1时,整个序列作为一个表来处理,表长度即使整个序列的长度。时间复杂度:...原创 2019-03-10 16:14:19 · 105 阅读 · 0 评论 -
归并排序
归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个典型的应用。思路:把长度为n的输入序列分为两个长度为n/2的的序列 对这两个子序列分别采用归并排序 将两个排好序的子序列合并成一个最终的排序序列时间复杂度:最好:O(nlogn) 最坏:O(nlogn) 平均:O(nlogn)空间复杂度:O(n)非递归代码如下:void Meger(int *...原创 2019-03-12 14:54:45 · 102 阅读 · 0 评论 -
二分查找法
二分查找思路:每一次找所查序列最重间的那个值,如果val小于最中间的值arr[mid],那下一次查找的区间就是left到mid - 1;如果要查找的val值大于最中间的值,那下一次查找的区间就是从mid+1到right;直到找到这个值或者left>right越界。时间复杂度:最坏:O(logn) 最优O(1) 平均O(log2(n))注意:二分查找的前提是需要查找的序列...原创 2019-05-05 17:57:27 · 546 阅读 · 0 评论 -
单链表和顺序表
顺序表:顺序表是在计算机内存中以数组的形式保存的线性表,是以段内存连续的存储数据元素的现性结构,只要确定了起始位置的地址,后面的元素就会连续的存储在起始地址之后。链表:链表是一种链式存取的数据结构,链式存储的的数据元素的地址在内存中是任意的。它的数据是以结点来存储的,还需要一个指针来将所有的结点连接起来。单链表的代码如下:typedef class Node{public: i...原创 2019-05-13 20:57:04 · 2231 阅读 · 0 评论 -
双向链表和循环链表
双向链表双向链表和单链表的区别就在于多了一个前驱;有需要查看单链表的在主页里面查找;双向链表代码如下:typedef class Node{public: int data; Node *next; Node *pre;}node;class doublelist{public: doublelist() { head = NULL; count ...原创 2019-05-15 21:35:44 · 602 阅读 · 0 评论