
基础算法
文章平均质量分 75
辣辣溜溜梅
这个作者很懒,什么都没留下…
展开
-
快速排序--递归加双指针实现( c ++)
原理 对于一段无序数组,如何实现快速排序? 我们可以定义两个指针 i 和 j 来分别指向数组的左右两端,再定义一个值 x 来使得值 x 左边的数全都小于等于 x, 值 x 右边的数都大于等于 x。 这样我们再利用递归来分别对 x 的左右两端进行操作,即可实现整段数组的排序。 实现---分三步 第一步:确定 x 先定义一个值 x,值 x 的定义我推荐用三数中值分割法。即在数组的首元素、中间元素和最后一个元素三者中选择中间值。这样的好处可以避免产生边界问题。 举个例子:给定一个数组 q内含有的.原创 2022-04-06 23:14:31 · 920 阅读 · 1 评论 -
归并排序---从原理到代码实现(C ++)
核心思想:分治 与快速排序的核心思想一样,都是分治。不同之处在于快速排序是先进行具体操作再递归。归并排序则是先递归再进行具体操作。(快速排序具体操作可以看我的另一篇博客,有详细讲解。)快速排序--递归加双指针实现( c ++) 即将给定的一段数组分为两段,分别出左右两端。(这一部分利用递归来对数进行排序) 原理: 利用递归分别将这组数分成左右两边,至递归最后,即左右两边都只剩一个数时,对其进行大小排序。 以每次递归处理这段数左边为例: 如上图:在第四次递归,只有两个数,这时我们将这.原创 2022-04-07 23:30:16 · 99 阅读 · 0 评论 -
二分查找---从原理到代码实现(C ++ 详解)
1. 二分查找是什么? 举个例子:在学校的体育上,老师让同学们严格按照高矮顺序进行排队。这时小明想知道自己在班里面的身高排第几?那么便数出小明是站在第几个就可以知道小明身高在班里面的排名。 二分查找就是找到你在队伍中的位置的过程。 2. 二分查找的原理: 在一段有序数组q中,选取中间位置的数值q[middle],与所要查找的数值x比较大小,若是q[middle]大于x,那么将区间更新至left - middle。同理,小于的情况也可以得出为mid - right。 最后即可得出所要求的数值在该有序数组的位置原创 2022-04-08 19:34:46 · 277 阅读 · 0 评论 -
离散化处理区间和问题 --- 从原理到代码实现(C ++ 代码模板)
一、离散化的原理 将给定的 n 个数根据相对位置映射至 0 ~ n - 1的一段新的数组中。 具体的实现步骤: 首先将需要离散化的值进行排序(C ++ 中有 sort 库函数,可以直接调用。若是想自己实现,这里给出介绍快排的传送门:快速排序–递归加双指针实现( c ++)) 将排序后的数进行去重 查找离散化后的相对位置,利用二分查找(具体的二分查找在之前的博客中有介绍,这个是传送门:二分查找—从原理到代码实现(C ++ 详解)) 举个例子: 离散化实现代码: vector<int> all原创 2022-04-09 22:50:44 · 265 阅读 · 0 评论 -
高精度算法 --- 加法、减法、乘法和除法(C ++ 代码模板)
一、高精度算法(下文分别给出模板) 原理: 当一个数很大时,大到普通的 int 存不下时,可以考虑用数组来存储,即数组中一个位置存放一位。 但是对于数组而言,一个数顺序存入数组后,对其相加减是很简单的。但是当要进位时,是相当麻烦的。因为要将整个数组全都往后移动一位,将最高位的进位位置空出来,这个操作是 O(n) 的。 有一种方法可以很好的解决进位的问题。就是将这个数的个位数存至数组中的第一位(即 a[0]),最高位存入数组的最后一位(a[n - 1])。这样在处理进位时可以直接在数组的最后一位添加即可。在输原创 2022-04-10 23:34:47 · 722 阅读 · 0 评论 -
前缀和 --- 一维与二维 (C ++ 详细图解)
一、 一维前缀和 原理 给定一个 a 数组,请求出它的前缀和数组 s : 那么 a 数组的前缀和数组为: a 数组与 s 数组之间满足:s[ i ] = a[ 0 ] + a[ 1 ] + a[ 2 ] + … + a[ i ] 但是,由于我们在计算前缀和时,为了更加方便,我们会将数组下标从 1 开始存入和读取。 所以,我们的 s 前缀和数组为: s[ i ] = a[ 1 ] + a[ 2 ] + … + a[ i ] 应用 若是要求某个区间的和该怎么办? 用以上的例子,我们想求 a 数组中下标从 3原创 2022-04-12 22:48:49 · 351 阅读 · 0 评论