搞什么飞机?快速排序算法都没搞懂,还敢说自己值20k?

news2024/12/24 2:37:05

引言

之前面试过一位求职者,其期望薪资是20k,面试时问到了排序算法,结果就是模棱两可,说这说那的…
所以,还是有必要学一些基础算法的
首先,搞明白学算法的重要性和为什么学算法

  1. 算法我认为是一种解决问题的思路,其不是固定的写法,类似于编程思维。学的算法多了,那么在进行编程时,可以有更多方式去实现特定的功能。比如当你要对很多的数据进行排序时,如果采取的算法合适,其可以让整个排序时间缩短很多倍。
  2. 很多人都说,我一个搞编程的,搞前端开发的,我不需要学算法。这句话其实我不是很认可。很多人在编程时遇到了技术瓶颈,就连查百度都不知道怎么查。还敢大言不惭说当前技术解决不了遇到的问题。有时候学习到的东西并不是立刻能排上用场,特别是算法。不仅短时间不会使用,时间长了还会忘得干净。那么为什么要学?增长知识点,解决视野盲区。最起码当你遇到那个算法的使用场景时,你能知道原来还有算法可以解决这个问题,而不是一头雾水。
  3. 不断学习的过程中,也让我学习到了很多的编程知识。比如说常用的流式编程,数位DP算法等。而这些东西,也是不断地能强化自己,我相信,只要坚持学习,到了35岁时,一定不会惧怕裁员。

那么简单的讲讲快速排序算法,这个算法很多科班专业都会学到,但是基本上只有少数爱学习具备一定的编程思维和空间想象能力的人才听得懂。

快排实现步骤

快速排序算法通过多次比较和交换来实现排序,其排序流程如下:

  1. 首先设定一个分界值,通过该分界值将数组分成左右两部分。
  2. 将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。此时,左边部分中各元素都小于分界值,而右边部分中各元素都大于或等于分界值。
  3. 然后,左边和右边的数据可以独立排序。对于左侧的数组数据,又可以取一个分界值,将该部分数据分成左右两部分,同样在左边放置较小值,右边放置较大值。右侧的数组数据也可以做类似处理。
  4. 重复上述过程,可以看出,这是一个递归定义。通过递归将左侧部分排好序后,再递归排好右侧部分的顺序。当左、右两个部分各数据排序完成后,整个数组的排序也就完成了。

排序演示

假设一开始序列{ xi }是:5,3,7,6,4,1,0,2,9,10,8。
此时,ref=5,i=1,j=11,从后往前找,第一个比5小的数是x8=2,因此序列为:2,3,7,6,4,1,0,5,9,10,8。
此时i=1,j=8,从前往后找,第一个比5大的数是x3=7,因此序列为:2,3,5,6,4,1,0,7,9,10,8。
此时,i=3,j=8,从第8位往前找,第一个比5小的数是x7=0,因此:2,3,0,6,4,1,5,7,9,10,8。
此时,i=3,j=7,从第3位往后找,第一个比5大的数是x4=6,因此:2,3,0,5,4,1,6,7,9,10,8。
此时,i=4,j=7,从第7位往前找,第一个比5小的数是x6=1,因此:2,3,0,1,4,5,6,7,9,10,8。
此时,i=4,j=6,从第4位往后找,直到第6位才有比5大的数,这时,i=j=6,ref成为一条分界线,它之前的数都比它小,之后的数都比它大,对于前后两部分数,可以采用同样的方法来排序。

示例代码

public class QuickSort {
	public static void main(String[] args) {
		int arr[]={3,1,23,3,1,4,5,199,20};
		new QuickSort().quickSort(arr, 0, arr.length-1);
		for(int i=0;i<arr.length;i++){
			System.out.print(arr[i]+" ");
		}
	}
	public void quickSort(int[] arr, int start, int end) {
		if (start < end) {
			int pivot = partition(arr, start, end);
			quickSort(arr, start, pivot - 1);
			quickSort(arr, pivot + 1, end);
		}
	}

	public int partition(int[] arr, int start, int end) {
		int pivot = arr[start];
		int left = start + 1;
		int right = end;
		while (left <= right) {
			while (left <= right && arr[left] < pivot) {
				left++;
			}
			while (left <= right && arr[right] >= pivot) {
				right--;
			}
			if (left < right) {
				int temp = arr[left];
				arr[left] = arr[right];
				arr[right] = temp;
			}
		}
		int temp = arr[start];
		arr[start] = arr[right];
		arr[right] = temp;
		return right;
	}
}

该算法的思路为选择一个基准元素(通常是第一个元素),然后将数组分为左右两个子数组,左子数组都小于基准元素,右子数组都大于等于基准元素。接着递归地对左右子数组进行排序,最后将左、右子数组和基准元素拼接起来即可。partition 方法用于确定基准元素最终所在的位置。

代码运行结果示意:
输入
int arr[]={3,1,23,3,1,4,5,199,20};
在这里插入图片描述

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

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

相关文章

Midjourney摄影真人风,超高清图片一篇足够

欢迎小伙伴光临&#xff0c;本博主打的就是一个真实&#xff0c;关注点赞不迷路&#xff0c;毫无保留奉献&#xff0c;欢迎大家来探讨&#xff0c;以上图片均是万能咒语篇出品。 有些小伙伴感觉我的咒语水分很大&#xff0c;出不来效果&#xff0c;如果出不来效果的&#xff0c…

windows sql server 如何卸载干净?

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 windows sql server 怎么卸载干净&#xff1f; 前言一、windows sql server是什么&#xff1f;二、如何卸载干净 1、关闭sql server服务2、到控制面板&#xff0c;卸载sql …

深入Mybatis框架:解读数据源的实现,整合MyBatis框架,事务管理,集成JUnit测试

深入Mybatis框架 文章目录 深入Mybatis框架了解数据源解读Mybatis数据源实现非池化的数据源实现池化的数据源实现 整合Mybatis框架使用HikariCP连接池Mybatis事务管理使用Spring事务管理 集成JUnit测试 前面已经了解了JavaBean的创建和注入到IoC容器中&#xff0c;接下来深入My…

Nginx服务优化

配置nginx隐藏版本号 隐藏nginx版本号&#xff0c;避免安全漏洞泄漏 方法一&#xff1a;修改配置文件法 [rootwww conf]# vim /usr/local/nginx/confnginx.conf17 http { 18 include mime.types; 19 default_type application/octet-stream; 20 21 serve…

Generative AI 新世界 | 大型语言模型(LLMs)概述

在上一篇《Generative AI 新世界&#xff1a;文本生成领域论文解读》中&#xff0c;我带领大家一起梳理了文本生成领域&#xff08;Text Generation&#xff09;的主要几篇论文&#xff1a;InstructGPT&#xff0c;RLHF&#xff0c;PPO&#xff0c;GPT-3&#xff0c;以及 GPT-4…

jQuery的引入/jQuery筛选/菜单下拉案例/对类操作/封装的动画/自定义动画/获取元素属性

jQuery的使用与引入 点击链接后进入页面 复制整个页面,随后后新建文件,把复制的粘进去 jQuery入口函数 样式处理/隐式迭代 小案例 排他思想 淘宝服饰 链式编程 操作css方法 封装的动画 淡入淡出 自定义动画 获取元素固有属性值

添加程序到右键菜单打开项目文件夹

以Pycharm为例 第一部分&#xff1a; 添加程序到右键菜单。这里实验程序为pycharm&#xff0c;路径是形如D://pycharm/pycharm.exe。实际路径不是&#xff0c;这里是为了简便。 1、打开注册表&#xff0c;找到如下&#xff1a;HKEY_CLASSES_ROOT\Directory\Background\shell …

JVM学习(十四):垃圾收集器(万字介绍CMS、G1)

目录 一、垃圾收集器们 二、CMS(Concurrent-Mark-Sweep)&#xff1a;低延迟 2.1 什么是CMS 2.2 CMS工作流程 2.3 详细描述 2.4 CMS的优缺点 2.4.1 优点 2.4.2 弊端 2.5 CMS常用参数 三、G1&#xff08;Garbage First&#xff09;收集器&#xff1a;区域化分代…

【2023最新】C站最全的Python实战项目合集(附源码),练完即可就业,从入门到进阶,基础到框架,你想要的全都有

不管是从编程语言排行榜来说&#xff0c;还是流行程度来说&#xff0c;Python目前都算得上是最好的编程语言之一。由于入门简单对初学者友好&#xff0c;而被广泛使用。 部分中小学已将Python编入教材&#xff0c;浙江高考加入Python&#xff0c;计算机二级也加入Python&#…

Redis数据结构简介

对redis来说&#xff0c;所有的key&#xff08;键&#xff09;都是字符串。 1.String 字符串类型 是redis中最基本的数据类型&#xff0c;一个key对应一个value。 String类型是二进制安全的&#xff0c;意思是 redis 的 string 可以包含任何数据。如数字&#xff0c;字符串&am…

【数据库从0到1】-入门基础篇

【数据库从0到1】-入门基础篇 &#x1f53b;一、数据库产生背景&#x1f53b;二、数据库有关概述&#x1f53b;三、数据库访问接口&#x1f53b;四、数据库种类&#x1f53b;五、数据库有关术语&#x1f53b;六、常见DBMS排名&#x1f53b;七、常见数据库介绍7.1 RDS(关系型数据…

前端gulp的安装和使用,你或许用得到

gulp安装 1.npm install --global gulp-cli全局安装&#xff08;只需要执行成功一次&#xff0c;之后就不需要再全局安装了&#xff09; 2.npx mkdirp my-project创建项目并进入 3.cd my-project进入目录 4.npm init在项目目录下创建 package.json 文件 5.npm install --sav…

分享24个强大的HTML属性,建议每位前端工程师都应该掌握!

HTML属性非常多&#xff0c;除了一些基础属性外&#xff0c;还有许多有用的特别强大的属性 本文将介绍24个强大的HTML属性&#xff0c;可以使您的网站更具有动态性和交互性&#xff0c;让用户感到更加舒适和愉悦。 让我们一起来探索这24个强大的HTML属性吧&#xff01; 1、Ac…

tqdm.notebook显示进度条

需要安装hbox插件 如图是无法正常显示进度条插件的 要在Jupyter Notebook中使用HBox&#xff08;即水平盒子&#xff09;布局插件&#xff0c;您需要执行以下步骤&#xff1a; 确认您已经安装了Jupyter Notebook和ipywidgets。如果没有安装&#xff0c;您可以使用如下命令进行…

【蓝桥杯单片机第八届国赛真题】

【蓝桥杯单片机第八届国赛真题】 文章目录 【蓝桥杯单片机第八届国赛真题】前言一、真题二、源码 前言 有幸进入国赛&#xff0c;为自己大学最后一个比赛画上完满的句号^^ 下面为蓝桥杯单片机第八届国赛程序部分&#xff0c;功能差不多都实现了&#xff0c;可能存在小bug&#…

Qt(C++)使用QChart动态显示3个设备的温度变化曲线

一、介绍 Qt的QChart是一个用于绘制图表和可视化数据的类。提供了一个灵活的、可扩展的、跨平台的图表绘制解决方案,可以用于各种应用程序,如数据分析、科学计算、金融交易等。 QChart支持多种类型的图表,包括折线图、散点图、柱状图、饼图等。它还支持多个数据系列(data…

Emacs之magit提交代码(一百零八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

【Python】导出docx格式Word文档中的文本、图片和附件等

【Python】导出docx格式Word文档中的文本、图片和附件等 零、需求 为批量批改学生在机房提交的实验报告&#xff0c;我需要对所有的实验文档内容进行处理。需要批量提取Word文档中的图片和附件以便进一步检查。如何提取&#xff1f;我想到了用起来比较方便的Python&#xff0…

基于Three.js和MindAR实现的网页端摄像头头部帽饰、头盔3D虚拟试穿戴功能(含源码)

前言 研究学习、使用Mind AR有一段时间了&#xff0c;发现它的虚拟试穿戴功能还是比较好玩的&#xff0c;对售卖头部佩戴相关产品的公司还是有一定的应用价值的。例如&#xff1a;耳环、口罩、眼镜、头盔和帽子等都是适用的。 于是我收集了很多头部佩戴相关的3D模型进行测试&a…

人体姿态估计(Human Pose Estimation)

人体姿态估计的介绍与应用 姿态估计问题可以分为两大类&#xff1a;2D姿态估计和3D姿态估计。前者是为每个关键点预测一个二维坐标 (x,y) &#xff1b;后者是为每个关键点预测一个三维坐标 (x,y,z) &#xff0c;增加了一维深度信息。 2D姿态估计 主要有两种方法&#xff0c;基…