基础算法(一)零基础学算法---总结大篇
基础算法(一) 纯干货!! 排序及二分算法
码了7天,手残党也能看懂!!
手残第一篇:第一章 基础算法(一)
提示:你的三连是作者输出下去的动力哦!!真的真的!!!(小声哔哔:赶紧收藏!!内容持续更新中。。。)
文章目录【算法篇】
- 基础算法(一) 纯干货!! 排序及二分算法
- 前言
- 一、排序
- 1.快速排序 quick_sort
- 2.归并排序 merge_sort
- 二、二分算法
- 1、整数二分算法
- 2、浮点数二分算法
- 彩蛋,彩蛋!!
前言
- 已经断更一周了,深感愧疚!突然在思考一个问题!
是衣服穿得少比较冷还是裤子穿得少比较冷?我这衣服穿三件却没穿秋裤的老年人冷的直哆嗦。
- 哈哈哈哈废话不多说,以下是我学习算法的一些心得笔记,全是模板干货,感谢各位大佬,小伙伴的支持。以后一周一更,希望对各位有所帮助,话不多说直接上干货!!
不懂的问题欢迎下方评论区留言哦,一定一定尽量回答
一、排序
1.快速排序 quick_sort
- 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个,还有大大小的程序方面的考试如软考,考研中也常常出现快速排序的身影。
- 下面是作者自己总结的想法,帮助大家快速理解: 原理:首先定义一个基准值(为了防止边界问题,这里推荐取中点x),以及指针 i ,p。指针i为起始位小于基准值向右移,指针p为终点位大于基准向左移,不符条件时指针停止,两指针进行交换(即swap),进行下次循环重新定义基点,最终变成有序序列。
图解如下:
代码如下(示例):
void quick_sort(int q[],int i,int p)
{if(i>=p) return;int x =(i+p)<<1,g=i-1,u=p+1;while(i<p){do g++ ; while(q[g]<x);do u--; while(q[u]>x);if(i<j) swap(q[g],[u]);quick_sort(q,i,g),quick_sort(q,g+1,p);}
}
2.归并排序 merge_sort
- 归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and
Conquer)的一个非常典型的应用。时间复杂度同为O(N*logN)。许多小伙伴一眼看去肯定是懵的吧(和我当初一样哈哈哈,苦逼专研4小时),先将经验总结如下: - 原理:将数组以递归的方式分为n个元素即时间复杂度为logN,再进行整合(此过程也是在递归的过程中完成)此过程时间复杂度为n,整合的过程中比较,因此就完成了归并排序。主要思想还是先分后合,可以看着代码将思想代入无限递归的最后一层,会帮助你清晰很多!
图解如下:
代码如下(示例):
void merge_sort(int q[],int i,int p)
{if(i>=p) return;int mid = (i+p)>>1;merge_sort(q,l,mid),merge_sort(q,mid+1,p);int k = 0, l = i,r = mid + 1;while(i>=p)if(q[l]<q[p]) tmp[k++] = q[l++];else tmp[k++] = q[p--];while(l<=mid) tmp(k++) = q[l++];while(r>=p) tmp(k++) = q[p--];for(int r = 0,l = i;r <= p;i++,k++) q[i]=tmp[r];
}
二、二分算法
1、整数二分算法
- 二分法,即二分搜索法,是通过不断缩小解可能存在的范围,从而求得问题最优解的方法。下面两种任用其一就行,分别求左右临界点,一般情况下左右临界点相等,除某些特殊题型需要查找出左边界和右边界。如:
起起始位置即左边界,终止位置即右边界。
- 图解:好吧,这个比较简单,博主就没找图啦,直接说原理!
- 其原理就是:先判断mid的值满足某种条件,于是可以将边界点左右俩边分为满足此条件和不满足此条件,如果mid的值满足此条件说明查找值在不满足此条件的值的那边。为了更好的理解,举个例子:猜数字玩过吧,比如这0-1000这个数字,第一次猜测为500,对方如果反馈数字大了,则说明要猜测的数字在0-499之间,如果反馈猜小了,那么说明要猜测的数字就在501-999之间。
还没看懂的小可爱可以结合代码理解哦
代码如下(示例):
bool cheak(int x) {/****/}//检验x是否满足某种性质// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:
int binarysearch_1(int l,int r)//向左查找,寻找右临界点
{while(l<r){int mid = (l + r) >> 1;if(cheak(mid)) r = mid;//如果x在mid左边,则另右端点等于midelse l = mid + 1; } return l;
}// 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用:
int binarysearch_2(int l,int r)//向右查找,寻找左临界点
{while(l<r){int mid = (l+r)>>1;if(cheak(mid)) l=mid;else r = mid-1;}return l;
}
每次取中点,也就相当于分的过程,所以时间复杂度最坏的情况下用O (log n)来完成。
2、浮点数二分算法
- 和整数一样本质上也是寻找一个边界,和整数二分不同的是,浮点数不存在由于(整数)取整导致的边界问题,每次二分区间严格减半,因此比整数二分简单的多,每次更新边界时直接让r = mid或l = mid即可。当整个区间的长度足够小的时候(这里取的是10-6)就可以认定找到了答案。
代码如下(示例):
bool cheak(double x) {/****/}//检验x是否满足某种性质double Fbinarysearch(double l,double r)
{const double eps = 1e-6;// eps 表示精度,取决于题目对精度的要求while(r - l > eps){double mid = (l + r) >> 1;if(cheak(mid)) r = mid;else l = mid;}return l;
}
彩蛋,彩蛋!!
终于码完了!!!【哭!】
- 都康到这里了,彩蛋就是、就是:今年你肯定是yyds!!!(不是永远单身)
大佬:就这啊?
我:就这了【哭!】
后面还会持续更新,欢迎下方评论区留言,下期见!!!
下期内容:
一、高精度
二、前缀和与差分
作者:琉璃Diaspora
基础算法(一)零基础学算法---总结大篇相关推荐
- 2018-02-03-PY3下经典数据集iris的机器学习算法举例-零基础
---layout: posttitle: 2018-02-03-PY3下经典数据集iris的机器学习算法举例-零基础key: 20180203tags: 机器学习 ML IRIS python3mo ...
- 数据结构和算法_零基础入门01
数据结构和算法_零基础入门01 一.数据结构是什么? 逻辑结构.物理结构 二.算法 算法的五个基本特征 算法设计的要求 b站学习小甲鱼的数据结构与算法,自留笔记. 程序设计=数据结构+算法 一.数据结 ...
- 零起点学算法104——第几天?
零起点学算法104--第几天? Time Limit: 1 Sec Memory Limit: 128 MB 64bit IO Format: %lld Description 给定一个日期,输 ...
- 零起点学算法24——求正弦和余弦
零起点学算法24--求正弦和余弦 Time Limit: 1 Sec Memory Limit: 64 MB 64bit IO Format: %lld Description 输入一个正整数n ...
- 零起点学算法22——华氏摄氏温度转换
零起点学算法22--华氏摄氏温度转换 Time Limit: 1 Sec Memory Limit: 64 MB 64bit IO Format: %lld Description 输入一个华氏 ...
- 零起点学算法17——比较2个数大小
零起点学算法17--比较2个数大小 Time Limit: 1 Sec Memory Limit: 64 MB 64bit IO Format: %lld Description 输入2个整数, ...
- 零起点学算法11——求梯形面积
零起点学算法11--求梯形面积 Time Limit: 1 Sec Memory Limit: 64 MB 64bit IO Format: %lld Description 水题 Input ...
- 零起点学算法10——求圆柱体的表面积
零起点学算法10--求圆柱体的表面积 Description 很简单的问题,求圆柱体的表面积 Input 多组测试数据,每组输入底面半径r和高h Output 每组输出圆柱体的表面积,保留3位小数 S ...
- 零起点学算法07——复杂一点的表达式计算
零起点学算法07--复杂一点的表达式计算 Description 下面你来计算一个复杂一点的计算表达式 Input 没有输入 Output 输出表达式的值,保留2位小数 题目分析:根号要用sqrt来算 ...
- 零起点学算法03——超简单模仿算术题
零起点学算法03--超简单模仿算术题 Description 计算机计算能力很强哦. 让计算机帮你算其实也很容易,不过要学好计算机语言哦. 下面请看一个例子:要求计算机计算1+2的值并输出. 这 ...
最新文章
- 如何读懂MEMS惯性器件的精度指标
- 搭建私有npm私库(使用verdaccio)
- linux扩容家目录,linux 根目录扩容
- A Crowdsourcing Method for Correcting Sequencing Errors for the Third-generation Sequencing Data 一种用
- Linux dn命令大全,linux命令大全完整版.doc
- zoj2968 Difference Game
- 《SpringBoot揭秘:快速构建微服务体系》—第3章3.5节本章小结
- word万维计算机教程,计算机课件word文档.doc
- Django(三)框架之第二篇
- 【2016.11.17】HTML学习笔记第二天
- linux文件目录与管理
- linux内核维护者,Linux 内核维护者封杀明尼苏达大学(转载) - 优秀的Free OS(Linux)版 - 北大未名BBS...
- DELL ALIEN外星人笔记本安装UBUNTU,卡死的解决办法
- pycharm2017自建注册服务器
- 泛微平台ecology8.0二进制文件流下载对接接口
- bib文件引用参考文献方法--心得
- 超分辨率重建——关于YIQ空间
- CSS Flexbox布局
- 浅析“同比”与“环比”
- ubuntu 支持cuteFTP