扎实打牢数据结构算法根基,从此不怕算法面试系列之010 week02 01-01 最简单的排序算法-选择排序法的设计思想

这篇具有很好参考价值的文章主要介绍了扎实打牢数据结构算法根基,从此不怕算法面试系列之010 week02 01-01 最简单的排序算法-选择排序法的设计思想。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、基础排序算法

接下类,我们学习另外一类非常基础的算法,即排序算法。
排序算法是计算机科学领域研究的非常深入的一类算法,排序这个动作本身也是非常重要的,
很多时候面对无需的数据,首先需要做的就是对他们进行排序。


排序算法——目的:让数据有序。
排序算法——种类:种类也非常多,适用于不同的情景。
排序算法——思想:蕴含着重要的计算机科学中的算法设计思想。


我们即将学习2个简单的排序算法

  • 1、选择排序法
  • 2、插入排序法

通过对这2个基础的排序算法的学习,引申出更多东西,以打牢算法基础;
后续学习更加高级和更加复杂的算法时,可以有充分的准备。

特别是插入排序法,由于它的一些特殊性质,后续我们甚至在一些高级排序算法的学习中,甚至需要用到这种
类似插入排序这样的低级算法来进行一些优化。


2、选择排序法算法设计思想

我们接下来首先来看选择排序法。什么是选择排序法呢?它的思路本身很简单。
比如说,给我们一些待排序的元素,我们如何将这些本来是乱序的元素从小到大排列好呢?
非常简单,思路如下;

先在所有元素中将最小的元素拿出来
剩下的元素中,把最小的拿出来
剩下的元素中,把最小的拿出来
剩下的元素中,把最小的拿出来
……
只剩下一个元素,这个元素就是“剩下的元素中”最小的元素,将这最后一个元素拿出来

即:每次都选择还没处理的元素中最小的元素。
上述的思路就是选择排序法

我们现在创建一个数组如下:

其中最小的元素是1: 拿出最小的元素1: 接着继续拿出最小的元素,分别拿出2、3、4: 直到所有“剩余的最小的元素”全部拿完,新的排序后数组出现:

我们上述的图片流程,我们的数组从6、3、2、1、5、4
到1、2、3、4、5、6的这个过程。

其实是使用了一个额外的数组空间,是从旧的数组6、3、2、1、5、4的基础上,新开辟了一个数组。
之后每次从旧的数组中找到剩下的元素中最小的元素,然后存储到新开辟的数组中……

这样一个过程,其实这样操作就占用了额外的空间,也是一种空间上的浪费。

接下来,我们要做的一个比较重要的事情是,我们的选择排序可否在原地完成
这也是排序算法中非常重要的一个概念,即原地排序

可以参考度娘的定义:原地排序


后续,我们会接触较多原地排序的算法,随着深入学习,我们会发现,有些算法可以用原地排序的方式实现;
但是对于另外一些排序算法,我们是无法原地排序实现的,必须借助额外的空间。

我们今天即将实现的选择排序就是一个可以原地排序的算法。

接下来,我们对选择排序进行图流程讲解。


我们直接实现原地排序的算法代码,
其实思路比较简单,我们每一轮找剩下的元素中最小的元素,我们只需要把我们找到的最小的元素直接放在数组开头的位置即可,即直接利用原来的数组空间即可。
举一个例子:
对于我们的数组的索引i,它初始的时候指着我们的数组索引为0的位置,表示我们现在想寻找排序之后的数组的第0个元素的位置应该是谁?

为了找到这个最小的元素,我们可以再增加一个索引j,这个索引j从索引为0的位置出发,扫描一遍所有的元素,找到其中最小的元素。
之后我们再使用一个minIndex索引,记录索引j找到的最小的元素所在的索引位置。

增加一个索引j,这个索引j从索引为0的位置出发,扫描一遍所有的元素:
j从0开始扫描:

j扫描结束:

j找到的最小的元素所在的索引位置,记为minIndex:

排序之后的数组,它所对应的元素,应该是此时minIndex指向的1这个元素,现在i这个位置指向的元素是6这个元素,
我们所要做的事情,只需要把1和6这两个元素交换位置,此时i=0这个位置的元素就已经是最小的那个元素了。
交换前:

交换后:

接下来,进一步,我们就可以做i=1的操作:

我们再做这一步的时候,我们就可以看到,每一步开始前,相当于arr[i……n)是未排序的(注意arr[i……n)是前闭后开)。
顺便提一句:这里的分析,用到了我们之前梳理过的循环不变量的知识。
循环不变量

从arr[1]到arr[n]都还没有排序,但是arr[0]已经排序好了。


arr[i……n)是未排序的(注意arr[i……n)是前闭后开);
arr[i……n)中的最小值要放到arr[i]的位置;而原本arr[i]位置的元素,我们放到数组后面去,在后续的循环中继续处理。即min(arr[i]……arr[n])与arr[i]做交换。

j从arr[i]出发:

j扫描完整个数组:

j扫描完整个数组后,找到最小元素的索引,记作minIndex:

arr[i]与arr[minIndex]做交换:
交换前:

交换后:

此时arr[0]、arr[1]都已经排好序了。
下一轮循环开始前:


之后和前两轮循环一样,走完所有循环……
最后一轮循环过程如下:
j从arr[i]开始扫描:

j扫描完整个数组:

j扫描完整个数组后,找到最小元素的索引,记作minIndex:

arr[i]与arr[minIndex]做交换:
交换前:

交换后:

至此,整个数组重新排序完成。
整个流程的关键是什么呢?

1、arr[i……n)未排序,arr[0……i)已排序;
2、arr[i……n]中的最小值要放到arr[i]的位置。

其中的1,1、arr[i……n)未排序,arr[0……i)已排序;(注,这个就是我们我们的选择排序法的循环不变量)
循环不变量

我们每一轮循环都在保持这个循环不变量,我们保持的方法就是2:
2、arr[i……n]中的最小值要放到arr[i]的位置。

这样,我们就原地完成了选择排序法文章来源地址https://www.toymoban.com/news/detail-420758.html

到了这里,关于扎实打牢数据结构算法根基,从此不怕算法面试系列之010 week02 01-01 最简单的排序算法-选择排序法的设计思想的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 扎实打牢数据结构算法根基,从此不怕算法面试系列之010 week02 01-01 最简单的排序算法-选择排序法的设计思想

    接下类,我们学习另外一类非常基础的算法,即排序算法。 排序算法是计算机科学领域研究的非常深入的一类算法,排序这个动作本身也是非常重要的, 很多时候面对无需的数据,首先需要做的就是对他们进行排序。 排序算法——目的:让数据有序。 排序算法——种类:种

    2023年04月21日
    浏览(46)
  • 算法 数据结构分类 数据结构类型介绍 数据结构线性非线性结构 算法合集 (一)

     数据结构分为:                            a.线性结构                            b.非线性结构  a.线性结构:                       数据与结构存在一对一的线性关系; a . 线性结构 存储 分为:                                   顺序存储

    2024年02月10日
    浏览(36)
  • 【算法与数据结构】--算法应用--算法和数据结构的案例研究

    一、项目管理中的算法应用 在项目管理中,算法和数据结构的应用涉及项目进度、资源分配、风险管理等方面。以下是一些案例研究,展示了算法在项目管理中的实际应用: 项目进度管理 : 甘特图算法 :甘特图是一种项目进度管理工具,它使用甘特图算法来展示项目任务

    2024年02月08日
    浏览(40)
  • 数据结构与算法设计分析—— 数据结构及常用算法

    1、顺序表与链表 线性表是 线性结构 ,是包含n个数据元素的有限序列,通过顺序存储的线性表称为 顺序表 ,它是将线性表中所有元素按照其逻辑顺序,依次存储到指定存储位置开始的一块连续的存储空间里;而通过链式存储的 链表 中,每个结点不仅包含该元素的信息,还

    2024年02月07日
    浏览(43)
  • 数据结构和算法——数据结构

    目录 线性结构  队列结构的队列 链表结构的队列 链表的面试题 单向链表应用场景 约瑟夫环问题 栈结构 中缀表达式 前缀表达式 后缀表达式 非线性结构 图 递归解决迷宫问题 递归解决八皇后问题 顺序存储方式,顺序表 常见的顺序存储结构有:数组、队列、链表、栈 链式存

    2024年02月07日
    浏览(40)
  • 数据结构与算法 --- 数据结构绪论

    早期人们都把计算机理解为数值计算工具,就是感觉计算机当然是用来计算的,所以计算机解决问题,应该是先从具体问题中抽象出一个适当的数据模型,设计出一个解此数据模型的算法,然后再编写程序,得到一个实际的软件。 可现实中,我们更多的不是解决数值计算的问

    2024年02月14日
    浏览(40)
  • 数据结构与算法——数据结构有哪些,常用数据结构详解

    数据结构是学习数据存储方式的一门学科,那么,数据存储方式有哪几种呢?下面将对数据结构的学习内容做一个简要的总结。 数据结构大致包含以下几种存储结构: 线性表,还可细分为顺序表、链表、栈和队列; 树结构,包括普通树,二叉树,线索二叉树等; 图存储结构

    2024年02月15日
    浏览(45)
  • 数据结构与算法——什么是数据结构

    当你决定看这篇文章,就意味着系统学习数据结构的开始。下面我们先来讲什么是数据结构。 数据结构,直白地理解,就是研究数据的存储方式。 我们知道,数据存储只有一个目的,即为了方便后期对数据的再利用,就如同我们使用数组存储  {1,2,3,4,5}  是为了后期取得它们

    2024年02月15日
    浏览(39)
  • 【数据结构与算法】不就是数据结构

      嗨喽小伙伴们你们好呀,好久不见了,我已经好久没更新博文了!之前因为实习没有时间去写博文,现在已经回归校园了。我看了本学期的课程中有数据结构这门课程(这么课程特别重要),因为之前学过一点,所以就想着深入学习一下子。毕竟这门课程对于 考研 和 就业

    2024年02月07日
    浏览(33)
  • 【数据结构与算法】1.数据结构绪论

    📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有限,欢迎各位大佬指点,相互学习进步! 数据结构是计算机中存储、组织数据的方式。 数据结构是一种具有一定逻辑关系,

    2024年01月23日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包