algorithm
leon_wdbt
这个作者很懒,什么都没留下…
展开
-
算法与数据结构-并查集(并查集森林)(按秩合并)(路径压缩)(C++)
描述并查集是一种用于处理一些不相交集合的合并和查询问题的树型数据结构。通常在使用中以森林来表示。用森林的好处是降低了在合并(Union)操作时的时间复杂度。本文以并查集森林实现为例,学习该数据结构。思路用顺序表的形式来存储每个结点,每个结点的内容为该结点的直接父结点。例如,parent[i]表示第i个节点的父结点的索引。为了使并(Union)操作时尽可能保持较低的树高度,新增一个size...原创 2020-05-01 21:11:33 · 328 阅读 · 0 评论 -
二叉搜索树的实现与遍历(前中后序遍历)(层序遍历)(C++)
描述二叉搜索树(Binary Search Tree)又称为:二叉查找树、二叉排序树。它的每个结点的值都大于其左子树上的所有结点的值,并且小于其右子树上所有结点的值,就称为二叉搜索树。二叉搜索树是一种经典的数据结构,它既有链表的快速插入与删除操作的特点,又有数组快速查找的优势,所以应用十分广泛。思路定义一个树结点包含(key,value,*left,*right),分别表示树结点的键、值...原创 2020-04-29 11:44:13 · 418 阅读 · 0 评论 -
二分查找法-floor和ceil函数实现(C++)
描述有时候我们用二分查找法找的不是一个元素而是一段区域。这时候我们就可以设计floor(地板)和ceil(天花板)函数,找到相应区域的起始位置和结束位置。注意当我们要找的元素target不在序列中时,令floor指向比target小的第一个元素,ceil指向比target大的第一个元素。所以floor的取值要从[-1…n-1],ceil的取值为[0…n]。正因如此,所以在flo...原创 2020-04-28 12:55:09 · 974 阅读 · 0 评论 -
二分查找法(循环和递归)(C++)
实现代码#include<iostream>using namespace std;template<class T>int binarySearch(T arr[], int n, T target) { //arr[l...r]之中查找target int l = 0, r = n - 1; while(l <= r) { ...原创 2020-04-27 23:49:27 · 376 阅读 · 0 评论 -
算法与数据结构-队列应用(打印杨辉三角)(C++)
实现代码#include<iostream>#include<queue>using namespace std;void yhTriangle(int n) { queue<int> q; q.push(1); int temp; //打印n层 for(int i = 1; i <= n; i++) {...原创 2020-04-27 23:15:10 · 748 阅读 · 0 评论 -
算法与数据结构-索引堆优化(C++)
描述如果我们想要在索引堆中修改索引为i的元素,我们就需要找到索引i(也可以理解为索引为i的元素)在堆中的位置,并对其进行维护以保持堆特性。就是我们需要对索引进行遍历直到indexes[j] == i表示索引i在堆中的位置为j,并对位置为j的索引进行维护,这样一来就需要耗费O(n)的时间复杂度。为了提高这一操作的效率,我们可以引入一个reverse[i]表示索引i在堆中的位置,就可以非常方便地定...原创 2020-04-26 23:58:48 · 342 阅读 · 0 评论 -
算法与数据结构-索引堆(堆排序)(C++)
描述堆的概念就不多说了。有的时候堆存放的数据比较复杂,直接对堆中的元素进行操作将造成过大的时空开销,或者我们需要保持堆中数据的原有顺序不变。我们就可以用索引堆这种数据结构来解决,下面以最大索引堆为例介绍索引堆。思路初始化时,为每个元素顺序分配索引。arr[0…n-1]对应堆中data[1…n],索引为indexes[1…n]。插入操作。设定count指向最后一个元素的位置,data[++...原创 2020-04-25 23:50:22 · 447 阅读 · 0 评论 -
排序算法练习-希尔排序
介绍希尔排序(Shell’s Sort)又称为“缩小增量排序”(Diminishing Increment Sort),是对直接插入排序的改进版本。是一个非稳定的排序算法。时间复杂度为O(n1.3)~O(n2)。算法的时间复杂度对比:主要对插入排序作出以下改进:插入排序对近乎有序的数据效率非常高,可达到O(n)的时间复杂度。插入排序每次只移动一个位置,是低效的。思路设定一个增...原创 2020-04-25 10:52:48 · 821 阅读 · 0 评论 -
数据结构练习-原地堆排序
描述将需要排序的数组用构造成最大堆的算法进行原地排序。具体思路对于传入的数组arr[0…n-1],从第(n-1-1)/2个元素(即最后一个非叶子结点)开始往前进行堆化,构造成最大堆。这样一来arr[0]为最大元素。设定一个索引i = n-1交换arr[0]和arr[i],就把最大值放到了最后,同时对arr[0…i-1]进行堆化(只需要总0开始)。再让i - -,重复上一步,直到 i =...原创 2020-04-25 09:08:14 · 395 阅读 · 0 评论 -
数据结构练习-堆 (最大堆) (堆排序)
介绍我们所说的堆这种数据结构,通常指的是二叉堆,二叉堆是一棵完全二叉树。堆又可以分为最大堆和最小堆,本文以最大堆为例介绍堆这种数据结构。思路用数组存放堆中的元素,创建一个大小为n+1的连续空间data[0…n],data[1…n]用于存放堆中元素。插入操作。设定一个count指向最后一个元素位置,data[++count] = 新插入的元素。插入后堆需要进行调整,保证满足最大堆的性质。...原创 2020-04-23 08:10:50 · 856 阅读 · 0 评论 -
排序算法练习-三路快速排序
介绍三路快速排序是在双路快速排序的基础上进一步优化,对于处理有大量重复元素的情况,有很大的优势。算法思路以升序为例,设定arr[l+1…low] < arr[l]arr[high…r] > arr[l]arr[low+1…l) == arr[l]代码实现#include<bits/stdc++.h>#include<ctime>using...原创 2020-04-17 16:13:25 · 325 阅读 · 0 评论 -
排序算法练习-双路快速排序
介绍快速排序介绍算法思路双路快排的主要区别在于对元素的划分(Partiton)上。以升序为例,选择一个标定元素 e ,划分成比 e 小的元素都在 e 左边,比 e 大的元素都在 e 右边。分别从元素表的两端遍历,当两个索引的元素都不满足条件,交换元素的位置,直到遍历完。最后,让标定的元素与小于它的最后一个元素交换。代码实现#include<bits/stdc++.h>...原创 2020-04-16 23:51:41 · 330 阅读 · 0 评论 -
排序算法练习-快速排序(随机化快速排序)
介绍快速排序是一种时间复杂度为O(nlogn)级别的排序算法,但不是一种稳定的排序算法。因为它对数据的划分在空间上不一定是平衡的。下面用C++实现了一个基本的快速排序算法,并对其进行优化改进。具体思路以升序为例,选出一个标定的元素 e,对需要排序的数据进行划分使得比标定元素 e 小的元素排在 e 左边,比 e 大的元素排在 e 右边返回标定元素的位置,对左右进一步划分。以此类推,递归到...原创 2020-04-15 23:54:30 · 732 阅读 · 0 评论 -
排序算法练习-插入排序(优化)
介绍插入排序是一种时间复杂度为O(n2)级别的排序算法。那么为什么我们还要学习时间复杂度为O(n2)级别的算法呢?因为在有的时候插入排序反而更快,比如对一个近乎有序的数组或者元素值的波动范围比较小的情况下,插入排序有天然的优势。插入排序的思想也可以应用到更高级别的算法中,能够帮助我们进一步优化排序。具体思路设定一个索引值 i,索引到第2个元素的位置。再设定一个索引值 j,使 j = i ...原创 2020-04-14 12:10:11 · 574 阅读 · 0 评论 -
排序算法练习-归并排序(自底向上的归并排序)
介绍归并排序是一种时间复杂度为O(n log n)级别的排序算法,并且是一种稳定的排序算法。因为它划分出的每一部分在空间上都是大小相同的。下面用C++实现了一个基本的归并排序算法,并对其进行优化改进。代码实现#include<bits/stdc++.h>using namespace std;template<class T>void _merge(T arr...原创 2020-04-13 15:11:41 · 466 阅读 · 0 评论