第一章 基础算法(一)

文章目录

  • 排序
    • 快速排序--分治
    • 归并排序
  • 二分
    • 整数二分
    • 浮点数二分

整体框架 image-20220730150506200

image-20220730150654137

排序

快速排序–分治

image-20220730150937009

785题目:
给定你一个长度为 n 的整数数列。请你使用快速排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。输入格式
输入共两行,第一行包含整数 n。第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整个数列。输出格式
输出共一行,包含 n 个整数,表示排好序的数列。数据范围
1≤n≤100000
输入样例:
5
3 1 2 4 5
输出样例:
1 2 3 4 5
#include <iostream>
using namespace std;
int n;  //输入
const int N = 100010;  //规模设置
int q[N];  //存储数据数组
void quick_sort(int q[],int l ,int r)
{//判边界//首先判断数组是否为空或者只有一个数据if(l >= r) return ;int x = q[(l+r)>>1],i = l-1,j = r+1;  //首先进行一个++与--的操作,因此一开始位置相差1while(i<j)  //停止条件: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,j);quick_sort(q,j+1,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]);
}

  1. i与j必须错开一位,不能使i与j最后指向一个数字
  2. quick_sort(q,l,j); 下界必须是j。以后进行解释
  3. 调试bug注意执行条件之间的区别

改成while写法

#include <iostream>
using namespace std;
int n;
const int N =100010;
int q[N];void quick_sort(int q[],int l,int r)
{if(l>=r) return ;int x = q[l];int i = l,j = r;while(1){while(q[i] < x) i++;while(q[j] > x) j--;if (i >= j) break;swap(q[i],q[j]);  i++;j--;}quick_sort(q,l,j);quick_sort(q,j+1,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 <iostream>  //库函数
using namespace std;  //命名空间 
int n;
const int N =100010;
int q[N];void quick_sort(int q[],int l,int r)
{if(l>=r) return ;int x = q[l];int i = l,j = r;while(i < j)  {while(q[i] < x) i++;while(q[j] > x) j--;if(i < j) {swap(q[i],q[j]);  i++;j--;//执行完该操作后i j值可能相等,导致中间值未进行比较划分  }}quick_sort(q,l,j);quick_sort(q,j+1,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;
}/*
错误示例
输入
5
3 4 10 2 3输出
2 3 10 3 4 
*/

归并排序

image-20220730152621184

image-20220730152736826

image-20220730153054618

787
给定你一个长度为 n 的整数数列。请你使用归并排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。输入格式
输入共两行,第一行包含整数 n。第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整个数列。输出格式
输出共一行,包含 n 个整数,表示排好序的数列。数据范围
1≤n≤100000
输入样例:
5
3 1 2 4 5
输出样例:
1 2 3 4 5
#include <iostream>using namespace std;int n ;const int N = 100010;int q[N],tmp[N];
void merge_sort(int q[],int l ,int r)
{//递归推出条件:区间内没有数字或者只有一个数if(r<=l) 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]) tmp[k++] = q[i++];else tmp[k++] = q[j++];}while(i<=mid) tmp[k++] = q[i++];while(j<=r) tmp[k++] = q[j++];//边界判断:[l,r] r为闭区间for(i = l,k = 0;i <= r;i++,k++) q[i] = tmp[k]; 
}int main()
{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]);}

二分

整数二分

image-20220730154803028

789
给定一个按照升序排列的长度为 n 的整数数组,以及 q 个查询。对于每个查询,返回一个元素 k 的起始位置和终止位置(位置从 0 开始计数)。如果数组中不存在该元素,则返回 -1 -1。输入格式
第一行包含整数 n 和 q,表示数组长度和询问个数。第二行包含 n 个整数(均在 1∼10000 范围内),表示完整数组。接下来 q 行,每行包含一个整数 k,表示一个询问元素。输出格式
共 q 行,每行包含两个整数,表示所求元素的起始位置和终止位置。如果数组中不存在该元素,则返回 -1 -1。数据范围
1≤n≤100000
1≤q≤10000
1≤k≤10000
输入样例:
6 3
1 2 2 3 3 4
3
4
5
输出样例:
3 4
5 5
-1 -1
//789
#include <iostream>using namespace std;int n,m;
const int N = 100000;
int q[N];int main()
{scanf("%d %d",&n,&m);for(int i = 0;i<n;i++) scanf("%d ",&q[i]);while(m--){int x;scanf("%d",&x);int l = 0,r = n-1;//l 比 r小遍历while(l < r){int mid = l+r >>1;//注意:第一个点满足右边的条件//由于是求右边的边界,满足条件右边缩小if(q[mid] >= x) r =mid;//不满足条件,向右边靠拢,因此有个+1else l = mid+1;}if(q[l]!=x) cout<<"-1 -1"<<endl;else{cout<<l<<" ";int l = 0,r = n-1;while(l<r){//注意:第二个点满足右边的条件//由于是求左边的边界,满足条件左边缩小int mid = l+r+1 >>1;if(q[mid] <= x) l = mid;//不满足条件,向左边靠拢,因此有个-1else r = mid -1;}cout<<l<<endl;}}return 0;
}

浮点数二分

image-20220730155951140

#include <iostream>
using namespace std;
int main()
{double x;cin>>x;double l = 0;r = x;while(r-l > 1e-6){double mid = (l+r)/2;if(mid*mid >= x) r = mid;else l =mid;}printf("%lf\n",l);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/341119.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java8hashmap_Java 8中的HashMap性能改进

java8hashmapHashMap<K, V>是每个Java程序中快速&#xff0c;通用且无处不在的数据结构。 首先是一些基础知识。 您可能知道&#xff0c;它使用键的hashCode()和equals()方法在存储桶之间拆分值。 存储桶&#xff08;箱&#xff09;的数量应略高于映射中的条目数&#xf…

装前必看施工干货,贴瓷砖的5大步骤。福州中宅装饰,福州装修

亲爱的朋友们&#xff0c;你们是否曾经在装修房屋时遇到过贴砖的难题呢&#xff1f;贴砖可是装修工程中一项重要的工艺&#xff0c;它直接影响到整个装修的效果和质量。今天&#xff0c;我就来跟大家分享一下贴砖的几个重要要点&#xff0c;希望对你们有所帮助。 1️⃣ 选材是关…

Typora+Node.js+PicGo搭建图床

目录 一 问题背景 二 具体步骤 2.1 picgo的安装 1. 下载picgo 2. 安装 3. 效果 2.2 Node.js的安装 (1)下载链接 &#xff08;2&#xff09;安装步骤 2.3 Gitee设置 2.3.1在gitee上面创建一个仓库 2.4 整体配置 2.4.1 picgo软件配置 2.4.2 图床设置 2.4.3 Typora配…

JMetro版本11.6和8.6发布

再次返回另一个JMetro版本。 这是一个重要的里程碑&#xff0c;此版本中增加了样式&#xff0c;JavaFX库中的所有JavaFX控件现在都具有JMetro样式。 除此之外&#xff0c;还有用于ControlsFX StatusBar的新JMetro样式&#xff0c;对现有样式的样式调整&#xff0c;错误修复等。…

第一章 基础算法(二)

文章目录高精度高精度加法高精度减法高精度乘法高精度除法前缀和一维前缀和二维前缀和--求子矩阵中一部分和差分一维差分二维差分高精度 高精度加法 791 给定两个正整数&#xff08;不含前导 0&#xff09;&#xff0c;计算它们的和。输入格式 共两行&#xff0c;每行包含一个…

第一章 基础算法(三)

文章目录双指针算法双指针算法分类双指针算法模板性质&#xff1a;总结例1例2位运算二进制的第k位lowbit 返回x的最后一位1实现计算机中编码知识做题思路离散化区间合并双指针算法 双指针算法分类 双指针算法模板 性质&#xff1a; 总结 为什么双指针算法可以起到优化的作用&a…

第二章 数据结构(二)

文章目录Trie树存储并查集常规例题并查集维护多余信息堆性质存储基础操作downup操作例题Trie树 Tire&#xff1a;高效地存储和查找字符串集合的数据结构 存储 如果没有就创建。 对单词结尾进行标记&#xff0c;表示以当前节点结尾的地方存在一个单词 维护一个字符串集合&am…

Apache Camel 3只有2个月的路程

骆驼队正忙于为 Apache Camel3 。今天&#xff0c;第二个候选版本已构建并发布在暂存库中&#xff0c;供早期的适配器尝试 。 当我自己很忙的时候&#xff0c;我只想写一篇简短的博客文章&#xff0c;以使社区了解Apache Camel 3即将发布&#xff0c;我们希望它在今年年底&am…

第二章 数据结构(三)

文章目录哈希表存储结构拉链法&#xff1a;插入查询题目注意开放寻址法查找质数代码字符串哈希方式STL相关知识哈希表存储结构 整体结构 0~109->0~105 方法&#xff1a; x mod 105处理冲突 开放寻址法拉链法 拉链法&#xff1a; 思想&#xff1a;每个槽上拉一条链&…

Vaadin 10+作为CUBA UI的未来

从一开始&#xff0c;Vaadin就成为CUBA平台用户界面的基石和重要组成部分。 由于其创新的方法&#xff0c;它帮助CUBA将企业用户界面开发带到了一个非常有希望的&#xff08;如今是默认&#xff09;的WEB领域。 Vaadin最令人兴奋的部分之一是整个开发都是同构的&#xff0c;并且…

第二章 数据结构(一)

文章目录整体结构为什么用数组链表与邻接表单链表存储插入插入至头结点将x插入到下标为k的点后面删除遍历双链表初始化插入删除邻接表栈和队列栈队列单调栈单调队列KMP整体结构 链表与邻接表&#xff08;用数组模拟&#xff09;栈与队列&#xff08;用数组模拟&#xff09;kmp…

第三章搜索与图论(一)

文章目录DFS与BFS区别DFS全排列n皇后BFS树和图的遍历树和图的存储数和图的遍历深度优先遍历宽度优先遍历图的宽搜应用框架DFS与BFS区别 DFS: 执着&#xff1a;一直走到头&#xff0c;回去的时候边回去边看能不能向下走 BFS: 稳重&#xff1a;每次只扩展一层&#xff0c;不会…

第三章 搜索与图论(二)

文章目录最短路朴素Dijkstra算法堆优化版的Dijkstra算法Bellman-Ford算法SPFA算法求距离判负环Floyd最短路 并不区分有向图和无向图&#xff0c;因为无向图是一种特殊的有向图。直接用有向图的算法&#xff0c;解决无向图的问题。 常见情况可以分为两大类 在图论中&#xff0…

第三章 搜索与图论(三)

文章目录朴素版PrimKruskal算法染色法匈牙利算法朴素版Prim 给定一个 n 个点 m 条边的无向图&#xff0c;图中可能存在重边和自环&#xff0c;边权可能为负数。求最小生成树的树边权重之和&#xff0c;如果最小生成树不存在则输出 impossible。给定一张边带权的无向图 G(V,E)&a…

CDF 图的含义

CDF 图用于创建经验累积分布函数图。 使用 CDF 图可以确定等于或小于 x 轴上的给定值的数据的百分比。 例如&#xff0c;在该 CDF 图中&#xff0c;大约 34% 的数据小于总脂肪值 10 克。 参考链接 1. https://www.jmp.com/support/help/zh/14-2/ba-distribution-22.shtml

rome rss_RSS阅读器使用:ROME,Spring MVC,嵌入式Jetty

rome rss在这篇文章中&#xff0c;我将展示一些创建Spring Web应用程序的指南&#xff0c;这些应用程序使用Jetty并使用名为ROME的外部库运行RSS来运行它。 一般 我最近创建了一个示例Web应用程序&#xff0c;充当RSS阅读器。 我想检查ROME以阅读RSS。 我还想使用Spring容器和…

Ubuntu系统输入中文方式

我目前知道Ubuntu有两个还算好用的中文输入法&#xff1a; Fcitx&#xff1a;它是Linux世界开源的输入法框架&#xff0c;提供 Google PinYin、ShuangPin、SunPinYin、Wubi、ZhengMa、Hong Kong 和 TaiWan繁体等输入法。 1 安装Fcitx sudo apt install fcitx-pinyin fcit…

VMWare建立于W10的共享文件夹

一、共享文件夹建立 在虚拟机设置 -> 文件夹共享&#xff0c;选择总是启用&#xff0c;点击添加&#xff1a; 直接点击下一步&#xff1a; 选择原系统共享文件夹位置&#xff0c;并命名&#xff1a; 选择启用此共享&#xff0c;并继续&#xff1a; 二、VMtools安装 虚拟机…

VSCode如何去掉Monokai主题下的绿色下划线

VScode中类似sublime的主题为Monokai&#xff0c;但是自带主题Monokai中绿色下划线令人不舒服。 在网上寻找多种方式去除下划线。终于找到一种合适的处理方式。 1 安装主题插件 在主题插件中搜索One Monokai Theme&#xff0c;下载并安装 2 配置全局主题 通过快捷键“Ctr…

解决 ZLibrary 登录/注册不了的问题

一 文章转载链接内容 转载链接&#xff1a;解决 ZLibrary 登录/注册不了的问题 - 知乎 很多小伙伴反馈说 Z-Library 能打开&#xff0c;但是不能登录。这实际上是由于官方登录入口受限导致的。话虽如此&#xff0c;我们仍然可以通过某些方法绕过这个限制。 >虽然我们注册时…