快速排序、归并排序、整数二分查找、浮点数二分查找

快速排序

主要思想是分治:

  1. 确定分界点
  2. 调整范围
  3. 递归处理左右两段

代码:

#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;
}

归并排序

主要思想是分治,快排以一个数来分界,归并以中间来分,并且先递归两边

  1. 确定分界点
  2. 递归排序左右
  3. 归并,合二为一

归并排序是稳定的

#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;
}

基础算法(排序 & 查找)的更多相关文章

  1. 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 ...

  2. javascript排序 查找算法大全

    在pptv的实习结束了, 忙着找工作的事,顺便把数据结构的那本书重新复习了一遍.为了加深印象,特意把里面的常用的排序.查找算法用js写了一遍 具体的实例在我的github上,大家可以访问的: http ...

  3. Python 迭代器&生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发

    本节大纲 迭代器&生成器 装饰器  基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - ...

  4. 算法与数据结构基础 - 拓扑排序(Topological Sort)

    拓扑排序基础 拓扑排序用于解决有向无环图(DAG,Directed Acyclic Graph)按依赖关系排线性序列问题,直白地说解决这样的问题:有一组数据,其中一些数据依赖其他,问能否按依赖关系排序 ...

  5. java基础---数组的查找算法(2)

    一.查找的基本概念 查找分为有序查找和无序查找,这里均以数组为对象,有序查找指的是数组元素有序排列,无序查找指的是数组元素有序或无序排列 平均查找长度(Average Search Length,AS ...

  6. 算法基础~链表~排序链表的合并(k条)

    算法基础~链表~排序链表的合并(k条) 1,题意:已知k个已排序链表头结点指针,将这k个链表合并,合并后仍然为有序的,返回合并后的头结点. 2,方法之间时间复杂度的比较: 方法1(借助工具vector ...

  7. python基础===八大排序算法的 Python 实现

    本文用Python实现了插入排序.希尔排序.冒泡排序.快速排序.直接选择排序.堆排序.归并排序.基数排序. 1.插入排序 描述 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一 ...

  8. STL基础--算法(排序)

    STL排序算法 排序算法要求随机访问迭代器 vector, deque, container array, native array 例子 vector<int> vec = {9,1,1 ...

  9. PHP基础算法

    1.首先来画个菱形玩玩,很多人学C时在书上都画过,咱们用PHP画下,画了一半. 思路:多少行for一次,然后在里面空格和星号for一次. <?php for($i=0;$i<=3;$i++ ...

  10. Java进阶(三十九)Java集合类的排序,查找,替换操作

    Java进阶(三十九)Java集合类的排序,查找,替换操作 前言 在Java方向校招过程中,经常会遇到将输入转换为数组的情况,而我们通常使用ArrayList来表示动态数组.获取到ArrayList对 ...

随机推荐

  1. 小白开始成长了+洛谷1488与CF629A Far Relative’s Birthday Cake题解

    终于开始我的博客生活了,希望博客可以让我记住学了什么,错了什么,接下来会有什么将出现. 记录写ACM生涯中的一些经验和网工经验吧,如果有人看我博客的话,希望可以留言给我提提意见,指导指导我啦~~~ 正 ...

  2. (十四).CSS3中的多列布局和伸缩盒布局

    1 多列布局 ① 设置给包裹元素的 CSS 属性(共 8 个属性) CSS 属性名 含义 值 column-count 设置列数 纯数字 column-width 设置列宽 长度 columns 同时 ...

  3. 将成员服务器ms1加到AD域中

    1.对ms1的ipv4设置,dns对应地址dc1服务器地址 2.修改计算机名,并加入域 重启后 2.以域用户登录方式有两种 1.  2. 检查ms1有没有加入dc1的域中 在dc1

  4. 算法学习01—Java底层的正整数与负整数

    算法学习01 - Java 底层的正整数与负整数 本节课学到的知识 编写一个方法,打印出 int 类型数字的二进制长什么样 为什么 int 类型的最大值是 2^32 - 1,最小值是 -2^32 负整 ...

  5. 文本的格式化标签(粗体,斜体)和 <div>和<span>标签(都是双标签)

    上一个笔记有提到各种型号的标题,为了保证文章的美观,又会有除了标题之外的东西,比如粗体,斜体,下划线,删除线和各种分隔 1加粗,<strong><strong/>或者<b ...

  6. Linux 里面安装多个jdk,进行切换

    alternatives --config java

  7. RPA的市场需求

    最基本的RPA软件机器人定义:机器人通过记录员工在电脑桌面上的操作行为,将业务处理规则和操作行为记录下来,并模拟人的方式在电脑上自动执行一系列特定的工作流程.采用RPA软件机器人解决方案,快速实施,快 ...

  8. 对于实现上一篇遇到的问题——MyBatis+增删改查(已解决)

    问题一:该Http不支持Get/Post方法 我根据网上的解决方法将Get和Post的位置来回换,还是不停报错: 后来偶然间看到一个博主发的"你的代码写在Get或者Post里面,就将没写代码 ...

  9. DBA必备的Mysql知识点:数据类型和运算符

    摘要:本文主要为大家带来Mysql中的3种数据类型和3种运算符. 本文分享自华为云社区<Mysql中的数据类型和运算符>,作者: 1+1=王. Mysql的数据类型 Mysql支持数值型. ...

  10. yhm的丘赛题解(其中的一些简单题)

    有选择地做了丘赛里的一些简单题,不定期更新     目录 [简单组合数学]2011丘赛个人[应数计算数学概统]第3题题解 [拉格朗日多项式插值]2011丘赛个人[应数计算数学概统]第2题题解 [概率] ...