数据结构
hansy2015
这个作者很懒,什么都没留下…
展开
-
数据结构笔记(5):线段树和树状数组模板
树状数组模板 struct fenwick { int* data; int n; fenwick(int _n) : n(_n) { data = new int[n]; for (int i = 0; i < n; i++) data[i] = 0; } ~fenwick() { delete[] data; } void add(int x) { while (x < n) {原创 2020-09-13 21:55:52 · 155 阅读 · 0 评论 -
数据结构笔记(4):索引堆
索引堆:对于索引堆来说,我们将索引和数据分开存储,而真正表征堆的数组是由索引构成的。如图1所示,二叉树的每个结点上写的不是数字而是索引号。当我们将这个数组变成对以后,这个数组变成图2的样子,我们可以看出数组的data域没有发生改变,发生改变的只是index域,二叉树中的每个元素仍是索引,而每个索引对应的元素才是堆中原本的元素。所以当我们维护这个堆的时候,比较时用的仍然时data域的数据,而交换就要交换index域的数据。 ...原创 2020-09-07 22:43:41 · 150 阅读 · 1 评论 -
数据结构笔记(3):堆和堆排序
堆的定义:堆首先必须是一棵完全二叉树,且这棵完全二叉树中的每个结点总是不大于(或不小于)其父结点。 要想完成堆排序首先要建立一个堆,而建立一个堆的关键就是shiftUp和shiftDown操作: shiftUp:这里以大顶堆为例 假设一个堆一开始如下图所示 现在我们往堆中插入52这个元素,如下图所示 shiftUp的核心思想就是:就是将新插入的元素与它的父结点进行比较,若它的值比父结点的大,则交换他们两个的位置,直到该结点的值小于其父结点,或者已经到达根结...原创 2020-09-02 09:01:49 · 212 阅读 · 0 评论 -
数据结构笔记(2):高级排序
这里介绍两个O(nlogn)的算法,归并排序和快速排序 归并排序:利用分治法的思想将数组一分为二,对分好的两段数组分别进行排序,再排好后的两段进行归并即可。 下面我们说一下归并排序几个可以优化的点: 当待排序的数组元素个数小于15个的时候我们采用插入排序,因为在数据量较大的时候,待排序列小于15个元素时我可以认为这些待排的元素近乎有序,而对于一个近乎有序的数组采用插入排序是接近O(n)的时间复杂度的 只有当arr[mid] > arr[mid + 1]时我们才进行归并 这里还添加一种利用循环(原创 2020-08-28 19:18:28 · 228 阅读 · 0 评论 -
数据结构笔记(1):基础排序
这里介绍三个O(n^2)的排序算法即插入排序、选择排序和冒泡排序,这三个排序算法应该是所有排序中最简单的。 插入排序:在已经排好序的序列中找一个合适的位置,将那个未被排序的数插入那个位置即可。 选择排序:在未排序序列找到一个最小值放到已排序的序列后面即可。 冒泡排序:每循环一次,通过逐位交换的方式将最大值往未排序的序列的最后一位推即可。 下面的代码针对不同的测试数据对上面三种算法的时间性能进行了相应测试 1.首先我们实现一个用于测试排序算法时间效率的类 #ifndef SORTTESTHELP原创 2020-08-25 09:05:16 · 352 阅读 · 0 评论