基础算法(排序 & 查找)
快速排序、归并排序、整数二分查找、浮点数二分查找
快速排序
主要思想是分治:
- 确定分界点
- 调整范围
- 递归处理左右两段
代码:
#include <iostream>
using namespace std;
const int N = 1e6+10;
int n,q[N];
void quick_sort(int q[],int l,int r) {
// 左右重合则返回
if (l >= r)
return;
// 选取分界点和双指针
int x = q[(l+r+1)/2],i=l-1,j=r+1;
while (i < j) {
do i++; while (q[i] < x);
do j--; while (q[j] > x);
if (i < j) swap(q[i],q[j]);
}
// 递归处理左右两段
quick_sort(q,l,i-1);
quick_sort(q,i,r);
}
int main() {
scanf("%d",&n);
for (int i=0;i<n;i++) {
scanf("%d",&q[i]);
}
quick_sort(q,0,n-1);
for (int i=0;i<n;i++)
printf("%d ",q[i]);
return 0;
}
归并排序
主要思想是分治,快排以一个数来分界,归并以中间来分,并且先递归两边
- 确定分界点
- 递归排序左右
- 归并,合二为一
归并排序是稳定的
#include <bits/stdc++.h>
using namespace std;
const int N = 10e6+10;
int n,q[N],temp[N];
void merge_sort(int q[],int l,int r) {
if (l >= r) return;
int mid = l + r >> 1; // 取中点
merge_sort(q,l,mid); // 递归排序左边
merge_sort(q,mid+1,r); // 递归排序右边
int k=0,i=l,j=mid+1;
// 归并 将两个有序序列合并为一个有序序列
while (i <= mid && j <= r) {
if (q[i] <= q[j]) temp[k++] = q[i++];
else temp[k++] = q[j++];
}
// 将未循环完的数直接拼接
while (i <= mid) temp[k++] = q[i++];
while (j <= r) temp[k++] = q[j++];
for (i=l,j=0;i<=r;i++,j++)
q[i] = temp[j];
}
int main(void) {
scanf("%d",&n);
for (int i=0;i<n;i++) {
scanf("%d",&q[i]);
}
merge_sort(q,0,n-1);
for (int i=0;i<n;i++) {
printf("%d ",q[i]);
}
}
二分查找(整数)
按照某种性质将区间一分为二,分成一半满足和另一半不满足
#include <iostream>
using namespace std;
const int N = 10e5 + 10;
int n,m,q[N];
// 检查x是否具有某种性质
bool check(int x) {
// .....
}
// 第一种: 区间[l,r]划分为[l,mid]和[mid+1,r]
int bsearch(int l,int r) {
while (l < r) {
int mid = l + r >> 1;
if (check(mid)) r = mid;
else l = mid + 1;
}
return l;
}
// 第二种: 区间[l,r]划分为[l,mid-1]和[mid,r]
int bsearch(int l,int r) {
while (l < r) {
int mid = l + r + 1 >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
return l;
}
二分查找(浮点)
浮点数的二分查找要关注精度
bool check(double x) {
// .....
}
double bsearch(double l,double r) {
const double eps = 1e-6;
while (r - l > eps) {
double mid = (l + r) / 2;
if (check(mid)) r = mid;
else l = mid;
}
return l;
}
基础算法(排序 & 查找)的更多相关文章
- PHP数组基本排序算法和查找算法
关于PHP中的基础算法,小结一下,也算是本博客的第一篇文章1.2种排序算法冒泡排序:例子:个人见解 5 6 2 3 7 9 第一趟 5 6 2 3 7 9 5 2 6 3 7 9 5 2 3 6 7 ...
- javascript排序 查找算法大全
在pptv的实习结束了, 忙着找工作的事,顺便把数据结构的那本书重新复习了一遍.为了加深印象,特意把里面的常用的排序.查找算法用js写了一遍 具体的实例在我的github上,大家可以访问的: http ...
- Python 迭代器&生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发
本节大纲 迭代器&生成器 装饰器 基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - ...
- 算法与数据结构基础 - 拓扑排序(Topological Sort)
拓扑排序基础 拓扑排序用于解决有向无环图(DAG,Directed Acyclic Graph)按依赖关系排线性序列问题,直白地说解决这样的问题:有一组数据,其中一些数据依赖其他,问能否按依赖关系排序 ...
- java基础---数组的查找算法(2)
一.查找的基本概念 查找分为有序查找和无序查找,这里均以数组为对象,有序查找指的是数组元素有序排列,无序查找指的是数组元素有序或无序排列 平均查找长度(Average Search Length,AS ...
- 算法基础~链表~排序链表的合并(k条)
算法基础~链表~排序链表的合并(k条) 1,题意:已知k个已排序链表头结点指针,将这k个链表合并,合并后仍然为有序的,返回合并后的头结点. 2,方法之间时间复杂度的比较: 方法1(借助工具vector ...
- python基础===八大排序算法的 Python 实现
本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一 ...
- STL基础--算法(排序)
STL排序算法 排序算法要求随机访问迭代器 vector, deque, container array, native array 例子 vector<int> vec = {9,1,1 ...
- PHP基础算法
1.首先来画个菱形玩玩,很多人学C时在书上都画过,咱们用PHP画下,画了一半. 思路:多少行for一次,然后在里面空格和星号for一次. <?php for($i=0;$i<=3;$i++ ...
- Java进阶(三十九)Java集合类的排序,查找,替换操作
Java进阶(三十九)Java集合类的排序,查找,替换操作 前言 在Java方向校招过程中,经常会遇到将输入转换为数组的情况,而我们通常使用ArrayList来表示动态数组.获取到ArrayList对 ...
随机推荐
- pdb 和 gdb 联调 python + cpython源码
起因: 下面这段奇怪的 python 代码,一个奇怪的 bug,简单来说就是在一个模块内定义了一个 class Test, 然后创建了一个 Test 的对象 ,然后在一个函数内通过 from impo ...
- 洛谷P1118数字三角形,
#include <bits/stdc++.h> using namespace std; int c[13][13];//杨辉三角 int b[13];//用于排除 int a[13]; ...
- jxg项目Day3 -数据库
可以通过 DOS 命令启动 MySQL 服务,点击"开始"菜单,在搜索框中输入"cmd",以管理员身份运行,按回车键,弹出命令提示符界面.mysql启动:net ...
- 转发:基于pnpm + lerna + typescript的最佳实践
Part1 Pnpm pnpm是一款当代受欢迎 新兴(问题较多) 的包管理工具. 为什么会出现pnpm?因为yarn的出现并没有满足作者的一些期待,反而有些失望. After a few days, ...
- c输入的缓冲区
作业题:输入两个整数(12和37),从键盘输入'A'和'a'时,输出两个数中的较大数:从键盘输入'B'和'b'时,输出两个数中的较小数. int a; char c; scanf("%d&q ...
- WSL安装Ubuntu 22.04 (2)
1.安装系统环境 1.1.设置软件包源为国内镜像 参考:Ubuntu更换国内镜像源 - 知乎 1.2.更新系统软件包 sudo apt-get update && sudo apt-g ...
- Unity2017-HTC项目串流Pico摇杆移动功能
最近公司PC项目需要串流到Piconec3上运行,HTC手柄是圆盘键按下移动还可以,但是Piconeo3是摇杆,按下移动的话显得不科学,所以写了一套基于圆盘键,使用摇杆移动的方法 第一步:编写摇杆左右 ...
- SQLServer自带备份优劣分析
众所周知, SQL Server自身的"维护计划"可以实现自动备份数据库. 既然这样,那还有必要使用第三方专业备份软件吗? 本文以[护卫神·好备份专业版]为例,分析两者之间的优劣. ...
- Python相关练习说明
Python练习情况说明 1.练习了在文件中进行统计的相关方法,基本操作其实差不多,步骤基本如下: # 1.打开相关文件,然后利用for循环进行按行读取的操作 # 2.读取的过程中,将读取到的数据加以 ...
- Java笔记第七弹
案例:复制Java文件(打印流改进版) import java.io.*; public class Main{ public static void main(String[] args) thro ...