排序与查找
排序与查找
hnjzsyjyj
这个作者很懒,什么都没留下…
展开
-
洛谷 P1094 [NOIP2007 普及组 T2]:纪念品分组 ← 贪心+排序
双指针算法,顾名思义就是使用两个指针(实践中常用两个变量来模拟双指针)来解决问题。这两个指针通常从数组/链表的两端或者一端开始移动,逐步缩小搜索范围,直到找到满足条件的解。原创 2024-07-14 11:34:20 · 560 阅读 · 0 评论 -
AcWing 3207:门禁系统 ← 桶排序中“桶”的思想
本题利用了“桶排序”中“桶”的思想。原创 2024-07-06 22:36:51 · 302 阅读 · 0 评论 -
按结构体“字符数组成员”对结构体数组进行排序
按结构体的“字符数组成员”对结构体数组进行排序前,需要自定义排序函数。其中,要用到 strcmp 函数。C++ 中 strcmp(a,b) 函数的用法● 若 len(a)>len(b),则返回1。● 若 len(a)==len(b),则返回0。● 若 len(a)原创 2024-04-30 17:04:23 · 188 阅读 · 0 评论 -
蓝桥杯:跳跃 ← 深搜(dfs)或动态规划(dp)
● 据题意,每次只能往右或往下走,且一步走的直线距离不超过 3,故有 9 种走法。这 9 中走法分别为:(0,1)、(0,2)、(0,3)、(1,0)、(1,1)、(1,2)、(2,0)、(2,1)、(3,0)。在代码中,可设 x 坐标增量 dx 及 y 坐标增量 dy 分别为:dx[]={0,0,0,1,1,1,2,2,3}及 dy[]={1,2,3,0,1,2,0,1,0}原创 2024-04-07 12:12:50 · 919 阅读 · 1 评论 -
AcWing 3425:小白鼠排队 ← 北京大学考研机试题
本题的一种实现方法需要按结构体某一字段对结构体数组进行排序,详见:https://blog.csdn.net/hnjzsyjyj/article/details/120184972本题的另一种实现方法是利用STL pair,然后调用 sort() 函数对 STL pair 进行排序。需要注意的是,sort() 函数默认是按照 pair 的 first 域进行升序排序。如果 first 域相同,则按照 second 域进行升序排序。原创 2023-12-11 11:27:45 · 259 阅读 · 2 评论 -
查找:B-树 ← PPT
查找:B-树 ← PPT原创 2023-10-11 23:34:30 · 99 阅读 · 0 评论 -
快速排序 ← PPT
快速排序 ← PPT原创 2023-10-11 21:48:31 · 207 阅读 · 0 评论 -
邓俊辉《数据结构》→ “2.6.5 二分查找(版本A)”之“成功查找长度”递推式推导
难点在于推出 C(k) 及 F(k)=2F(k-1) 两个递推式。原创 2023-09-22 09:23:07 · 254 阅读 · 0 评论 -
AcWing 787:归并排序
归并排序是一种常用且高效的排序算法,它采用分治法的思想来对序列进行排序。归并排序的基本思想是将序列分成较小的子序列,递归地对这些子序列进行排序,然后将它们合并在一起,产生最终的有序序列。原创 2023-09-05 12:35:25 · 161 阅读 · 0 评论 -
模板 → 快速排序算法模板
由于快速排序算法的基准值有多种选法,故其有多种实现。但是,在待排序的数据量较大时,若选择待排序列的首部或尾部元素作为基准值,则会产生Time Limit Exceeded错误提示。实践证明,选择待排序列的中间位置元素作为基准值实现的快速排序算法,在数据量较大时,可避免产生Time Limit Exceeded错误提示。大家可用 AcWing785 题目https://www.acwing.com/problem/content/787/进行验证。原创 2023-09-04 15:48:34 · 78 阅读 · 0 评论 -
AcWing 786:第k个数 ← 快速排序的应用
本题是快速排序算法的应用。即在快速排序算法代码模板的基础上,微改。快速排序算法的模板可详见:https://blog.csdn.net/hnjzsyjyj/article/details/132669946原创 2023-09-04 16:02:09 · 94 阅读 · 0 评论 -
AcWing 785:快速排序 ← vector
//交换时i的初始值为le-1,以保证选择到第一个大于mid的数v[i]//交换时j的初始值为ri+1,以保证选择到第一个小于mid的数v[j]原创 2023-09-02 22:12:29 · 367 阅读 · 1 评论 -
算法竞赛中,sort()函数的常见用法。
在算法竞赛中,如需要进行排序,我们一般不会去重复造轮子,即去实现某种排序算法后再使用,而是直接调用sort()函数。原创 2023-05-08 13:11:08 · 569 阅读 · 1 评论 -
基数排序 ← vector实现
基数排序是一种按位进行的桶排序,这样可以减少桶的数量。基数排序(Radix Sorting)是典型的分配类排序。分配类排序不需要比较关键字的大小,它是根据关键字中各位的值,通过对待排序记录进行若干趟“分配”与“收集”来实现排序的,是一种借助于多关键字排序的思想对单关键字进行排序的方法。原创 2022-11-16 10:38:24 · 184 阅读 · 0 评论 -
堆排序 ← 改编自《啊哈!算法》
堆排序依托于完全二叉树的结构,需要解决如下两个问题: 建初堆:如何将一个无序序列建成一个堆? 调整堆:去掉堆顶元素,在堆顶元素改变之后,如何调整剩余元素成为一个新的堆?原创 2022-11-14 16:17:23 · 271 阅读 · 0 评论 -
堆排序 ← priority_queue
priority_queue 中文意思为“优先队列”,本质上是一个堆。这使得程序员在编码过程中,可以直接利用 priority_queue 构建堆,从而避免了手动构建堆的繁琐。原创 2022-11-14 07:24:09 · 126 阅读 · 0 评论 -
简单选择排序 ← vector实现
选择排序的基本思想是:每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子表的最后,直到全部记录排序完毕。原创 2022-11-12 21:40:34 · 124 阅读 · 0 评论 -
快速排序 ← 三种基准值选择
快速排序(Quick Sort)是由冒泡排序改进而得的。在冒泡排序过程中,只对相邻的两个记录进行比较,因此每次交换两个相邻记录时只能消除一个逆序排列。如果能通过两个(不相邻)记录的一次交换,消除多个逆序排列,则会大大加快排序的速度。快速排序方法中的一次交换可能消除多个逆序排列。原创 2022-11-12 21:31:49 · 1044 阅读 · 1 评论 -
冒泡排序 ← vector实现
冒泡排序是一种最简单的交换排序方法,它通过两两比较相邻记录的关键字,如果为逆序,则进行交换,从而使关键字小的记录如气泡一般逐渐往上“漂浮”,或者使关键字大的记录如石块一样逐渐向下“坠落”。原创 2022-11-11 13:51:06 · 225 阅读 · 0 评论 -
希尔排序 ← vector实现
希尔排序(Shell's Sort)又称“缩小增量排序”(Diminishing Increment Sort),是插入排序的一种,因D.L.希尔(D.L.Shell)于1959年提出而得名。希尔排序实质上是采用分组插入的方法,先将整个待排序记录序列分割成几组,从而减少参与直接插入排序的数据量,然后对每组分别进行直接插入排序。之后增加每组的数据量,重新分组。这样当经过几次分组排序后,整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。原创 2022-11-10 21:00:04 · 208 阅读 · 0 评论 -
折半插入排序 ← vector实现
严蔚敏《数据结构(C语言版 第2版)》指出折半插入排序的算法步骤如下:①设待排序的记录存放在数组r[1..n]中,r[1]是一个有序序列。 ②循环n-1次,每次使用折半查找法,查找r[i] (i=2, …, n) 在已排好序的序列r[1..i-1]中的插入位置,然后将r[i]插入表长为i-1的有序序列r[1..i-1],直到将r[n]插入表长为n-1的有序序列r[1..n-1],最后得到一个表长为n的有序序列。原创 2022-11-09 23:51:48 · 292 阅读 · 0 评论 -
直接插入排序 ← vector实现
直接插入排序的算法步骤如下:① 设待排序的记录存放在数组r[1..n]中,r[1]是一个有序序列。 ② 循环n-1次,每次使用顺序查找法,查找r[i] (i=2, …, n) 在已排好序的序列r[1..i-1]中的插入位置,然后将r[i]插入表长为i-1的有序序列r[1..i-1],直到将r[n]插入表长为n-1的有序序列r[1..n-1],最后得到一个表长为n的有序序列。原创 2022-11-07 11:29:33 · 710 阅读 · 0 评论 -
二叉排序树 ← C++实现
本算法代码改编自严蔚敏编著的《数据结构(C语言版|第2版)》的随书代码。主要是利用了自己熟悉的C++语法进行改编,希望对大家学习二叉排序树的实现有所帮助。原创 2022-10-31 11:55:07 · 198 阅读 · 0 评论 -
顺序查找 ← vector实现
顺序查找,百度百科定义为“对于任意一个序列以及一个给定的元素,将给定元素与序列中元素依次比较,直到找出与给定关键字相同的元素,或者将序列中的元素与其都比较完为止”。顺序查找的优点是:算法简单,既适用于顺序结构,也适用于链式结构,无论序列是否按关键字有序均可应用。顺序查找的缺点是:顺序查找的时间复杂度为。,平均查找长度ASL的值较大,等于(1+2+…,显见查找效率较低。所以,当n很大时,不宜采用顺序查找。原创 2022-10-28 07:32:34 · 152 阅读 · 0 评论 -
二分查找 ← vector实现
折半查找(Binary Search)也称二分查找,它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。原创 2022-10-27 23:51:36 · 272 阅读 · 0 评论 -
设置了监视哨的顺序查找算法效率高?你确定吗?
实验验证的结果表明,有无设置监视哨,顺序查找算法所需的平均时间相当。原创 2022-10-27 17:40:34 · 782 阅读 · 0 评论 -
冒泡排序 ← C语言实现
【算法示意图】示意图来源于《啊哈!算法》【算法代码】#include <stdio.h>int a[100];int main() { int i,j,t,n; scanf("%d",&n); for(i=1; i<=n; i++) scanf("%d",&a[i]); for(i=1; i<=n-1; i++) { for(j=1; j<=n-i; j++) { if(a[j]>a[j+1]) { .原创 2022-04-25 14:30:31 · 1313 阅读 · 0 评论 -
桶排序算法 ← C++ 实现
桶排序的思想:若待排序的值在一个有限范围内(整型)时,可设计有限个有序桶,桶号就是待排序的值。之后,将待排序的值依次装入对应的有序桶中(重复值都装入对应的桶),然后顺序输出各桶的值,便得到有序的序列。原创 2021-08-20 11:36:59 · 121 阅读 · 1 评论 -
桶排序 ← C语言实现
【桶排序的思想】若待排序的值在一个有限范围内(整型)时,可设计有限个有序桶,桶号就是待排序的值。 之后,将待排序的值依次装入对应的有序桶中(重复值都装入对应的桶),然后顺序输出各桶的值,便得到有序的序列。【C语言代码】#include <stdio.h>#include <math.h>const int maxn=500;int t[maxn];int main() { int n; scanf("%d",&n); int x; //x原创 2022-04-20 23:02:03 · 1860 阅读 · 5 评论 -
使用STL vector实现的二分查找算法
【算法代码】#include <bits/stdc++.h>using namespace std;void biSearch(int x,vector<int> v) { sort(v.begin(),v.end()); //Because the elements have to be ordered int flag=0; int low=0; int high=v.size()-1; int mid; while(low<=high) {原创 2021-08-13 15:18:47 · 719 阅读 · 0 评论 -
CSP-J 2021 第二题:插入排序
【题目来源】https://www.luogu.com.cn/problem/P7910https://www.acwing.com/problem/content/description/4090/【算法代码】#include <bits/stdc++.h>using namespace std;const int maxn=8005;int a[maxn],b[maxn];int n,q;int op,u,v,ans;int main() { scanf("%d%d"原创 2021-12-05 19:08:46 · 1091 阅读 · 1 评论 -
归并排序 <-- 递归思想 分治思想 C++
【算法分析】归并算法基于分治策略,分治策略利用递归实现。归并排序理解之后,可以解决“小和问题”、“逆序对问题”等经典问题。下文归并排序的动画来源于:https://blog.csdn.net/kevinmeanscool/article/details/87916085【算法代码】#include <bits/stdc++.h>using namespace std;void merge(vector<int> &v, int low, int mid, i原创 2021-08-17 17:28:06 · 231 阅读 · 0 评论 -
逆序对的数量(脱胎于归并排序)
【问题描述】给定一个长度为n的整数数列,请你计算数列中的逆序对的数量。逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满 i < j 且 a[i] > a[j],则其为一个逆序对;否则不是。【输入格式】第一行包含整数n,表示数列的长度。第二行包含 n 个整数,表示整个数列。【输出格式】输出一个整数,表示逆序对的个数。【数据范围】1≤n≤100000【测试样例】输入样例:62 3 4 5 6 1输出样例:5【算法分析】利用归并排序,可以很方便写出求逆序对数量的代原创 2021-08-17 22:31:44 · 184 阅读 · 0 评论 -
归并排序(微改后便成为求逆序对数量的代码)
【归并排序算法代码】下文源代码是归并排序的一种实现方法。若去掉其中的第26行语句ans+=mid-ls+1; 及第42行语句cout<<ans;前的注释,并在第40行语句for(int i=1; i<=n; i++) cout<<a[i]<<" ";前添加注释之后,便成为求逆序对的代码。#include <bits/stdc++.h>using namespace std; const int maxn=100005;int...原创 2021-08-17 22:59:40 · 122 阅读 · 0 评论 -
快速排序 <- 分治思想 递归思想
【算法描述】快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。设要排序的数组是a[1]……a[n],首先任意选取一个数据(通常选用数组的中间数)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序原创 2021-08-17 23:42:47 · 150 阅读 · 0 评论 -
归并排序模拟执行示意图
【归并排序代码】#include <bits/stdc++.h>using namespace std; const int maxn=100005;int a[maxn];int t[maxn]; long long ans; void merge_sort(int low,int high) { if(low>=high) return; //"low>=high" equivalent to "low==high" int mid=(low+hi原创 2021-08-18 19:22:50 · 212 阅读 · 0 评论 -
洛谷:P1059 明明的随机数 ← NOIP2006 普及组T1 ← 桶排序
桶排序的思想:若待排序的值在一个有限范围内(整型)时,可设计有限个有序桶,桶号就是待排序的值。之后,将待排序的值依次装入对应的有序桶中(重复值都装入对应的桶),然后顺序输出各桶的值,便得到有序的序列。本题还要注意去重。原创 2021-08-20 12:06:55 · 298 阅读 · 0 评论