【面试八股总结】排序算法(一)

参考资料 :阿秀

一、冒泡排序

        冒泡排序就是把小的元素往前交换或者把大的元素往后交换,比较相邻的两个元素,交换也发生在这两个元素之间。具体步骤:

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

优化思路:

        假如从开始的第一对到结尾的最后一对,相邻的元素之间都没有发生交换的操作,这意味着右边的元素总是大于等于左边的元素,此时的数组已经是有序的了,我们无需再对剩余的元素重复比较下去了。

二、选择排序

        选择排序是给每个位置选择当前最小元素,循环遍历n-1次整个数组,每次遍历将最小值交换到遍历起始位置。具体步骤:

  1. 在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
  2. 从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾
  3. 以此类推,直到所有元素均排序完毕

三、插入排序

        插入排序是在一个已经有序的小序列基础上,一次插入一个元素。刚开始这个有序的小序列只有1个元素,就是第一个元素。比较是从有序序列的末尾开始,也就是想要插入的元素和已经有序的最大者开始比起,如果比它大则直接插入在其后面,否则一直往前找直到找到它该插入的位置。具体步骤:

  1. 从第一个元素开始,该元素可以认为已经被排序

  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描

  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置

  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置

  5. 将新元素插入到该位置后

  6. 重复步骤2~5

四、快速排序

        从数组中选择一个元素作为中轴元素吧,然后把数组中所有小于中轴元素的元素放在其左边,所有大于或等于中轴元素的元素放在其右边,显然,此时中轴元素所处的位置的是有序的。也就是说,我们无需再移动中轴元素的位置。

        从中轴元素开始把大的数组切割成两个小的数组(两个数组都不包含中轴元素),接着通过递归的方式,让中轴元素左边的数组和右边的数组也重复同样的操作,直到数组的大小为1,此时每个元素都处于有序的位置。具体步骤:

  1. 选取第一个数为基准
  2. 将比基准小的数交换到前面,比基准大的数交换到后面
  3. 对左右区间重复第二步,直到各区间只有一个数

五、希尔排序

        希尔排序是插入排序的一种变种,交换不相邻的元素以对数组的局部进行排序。希尔排序的思想是采用插入排序的方法,先让数组中任意间隔为 h 的元素有序,刚开始 h 的大小可以是 h = n / 2,让 h 一直缩小,当 h = 1 时,也就是此时数组中任意间隔为1的元素有序,此时的数组就是有序的了。

举个🌰:

1)h = n / 2 ,进行分组

2)每个组内进行排序 

3)缩小 h = n / 4,进行排序

4)直到 h = 1

六、归并排序  

        归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。

        通过递归的方式将数组一直分割,直到数组的大小为 1,此时只有一个元素,那么该数组就是有序的了,之后再把两个大小为1的数组合并成一个大小为2的数组,再把两个大小为2的合并成4的 … 直到全部小的数组合并起来。具体步骤:

  1. 把长度为n的输入序列分成两个长度为n/2的子序列;
  2. 对这两个子序列分别采用归并排序;
  3. 将两个排序好的子序列合并成一个最终的排序序列。

举个🌰:

图片来源:【算法】排序算法之归并排序 - 知乎 (zhihu.com)

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

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

相关文章

每日OJ题_BFS解决最短路①_力扣1926. 迷宫中离入口最近的出口

目录 力扣1926. 迷宫中离入口最近的出口 解析代码 力扣1926. 迷宫中离入口最近的出口 1926. 迷宫中离入口最近的出口 难度 中等 给你一个 m x n 的迷宫矩阵 maze (下标从 0 开始),矩阵中有空格子(用 . 表示)和墙&…

非线性SVM模型

5个条件判断一件事情是否发生,每个条件可能性只有2种(发生或者不发生),计算每个条件对这件事情发生的影响力。非线性SVM模型的程序。 例一 为了计算每个条件对一件事情发生的影响力,并使用非线性支持向量机&#xff0…

深度学习500问——Chapter08:目标检测(1)

文章目录 8.1 基本概念 8.1.1 什么是目标检测 8.1.2 目标检测要解决的核心问题 8.1.3 目标检测算法分类 8.1.4 目标检测有哪些应用 8.2 Two Stage 目标检测算法 8.2.1 R-CNN 8.2.2 Fast R-CNN 8.2.3 Faster R-CNN 8.1 基本概念 8.1.1 什么是目标检测 目标检测(Obj…

在 VS Code 中使用 GitHub Copilot

Code 结合使用。 GitHub Copilot 是什么 GitHub Copilot 是一个可以帮助你更简单、更快速地编写代码的工具,由 GPT-3 提供支持。你只需编写所需代码的描述——例如,编写一个函数来生成一个随机数,或对一个数组进行排序——Copilot 就会为你…

高质量数据赋能大模型应用落地,景联文科技提供海量AI大模型数据

随着人工智能技术的迅猛进步,AI算法持续创新突破,模型的复杂度不断攀升,呈现出爆炸性的增长态势。数据的重要性愈发凸显,已然成为AI大模型竞争的核心要素。 Dimensional Research的全球调研报告显示,72%的受访者认为&a…

重新总结一下以前写过的“波特率”!单片机常见的通信速率分析!

文章目录 如题以前文章新的总结如题 波特率是单片机中描述通信速率的一个单位,比如串口通信、SPI通信、IIC通信、LIN通信、CAN通信等等,现在重新总结一下涉及到波特率的一些知识点。 以前文章 新的总结 波特率的英文是Baud rate,而波特率的实际单位是bps 单片机很多的发送…

2024-04-11最新dubbo+zookeeper下载安装,DEMO展示

dubbozookeeper下载安装 下载zookeeper: 下载地址 解压,并进入bin目录,启动 如果闪退可以编辑脚本,在指定位置加上暂停脚本 报错内容说没有conf/zoo.cfg,就复制zoo_sample.cfg重命名为zoo.cfg 再次启动脚本&#x…

顶切,半顶切是什么意思?

齿轮加工及刀具中有一些特定名词或者叫法,不熟悉的小伙伴可能最开始会有一些困惑,这不,最近有小伙伴问了一个问题:顶切是说齿顶的倒角吗? 今天就给大家说说顶切和半顶切。 一、顶切 Topping 从字面上可以看到可以想到…

电大搜题:云南开放大学学子的学习利器

在现代社会,学习已经成为人们不可或缺的一部分。然而,对于云南开放大学的学子们来说,由于远程教育的特殊性,他们面临着更大的学习挑战。幸运的是,云南开放大学的学子们现在可以借助一款强大的学习利器——电大搜题微信…

Solana主网使用自定义的RPC进行转账

1、引言 如果用 browser 连接主网的 RPC server 会收到 error code 403 message 為 Access forbidden, contact your app developer or supportrpcpool.com. 错误,因为主网的 RPC server 会检查 HTTP Header 如果判断出來是 browser 就会报告 403 錯誤。 要解決这…

自己操作逆向案例一——某竞赛网登录密码加密,超级简单,泪目了!

网址:aHR0cHM6Ly9leGFtem9uZS5zYWlrci5jb20vcXVlc3Rpb24vZXhwbG9yZQ 打开开发者工具,点击账号密码登录,进行抓包 先进行搜索,发现一下子就找到了,且看上去很像MD5加密,打上断点,再次点击登录。…

Wpf 使用 Prism 实战开发Day18

数据加载动画实现 概要: 当打开功能页面时,在数据未加载完毕前,希望有一个友好的等待提示。那么,本章通过学习Prism 中事件聚合器(EventAggregator),并通过创建等待提示窗口,同时结…