shell编程排序算法_基本编程:排序算法

本文探讨了排序算法在处理信息时的重要性,介绍了选择排序、插入排序、冒泡排序、合并排序和快速排序五种算法的工作原理,并讨论了如何根据问题选择合适的排序算法。每种算法都有其适用场景,如插入排序适合小规模和部分有序的数据,快速排序通常是日常使用的最佳选择。了解这些算法有助于优化程序性能。
摘要由CSDN通过智能技术生成

shell编程排序算法

日历中的下一个任务,您最喜欢的运动队在联盟中的排名,手机中的联系人列表,所有这些都有一个订单。 当我们处理信息时,顺序很重要。 我们使用秩序来理解我们的生活并优化我们的决策。 想象一下在字典中按字母混合顺序查找单词,或者尝试在无序的定价表中查找最便宜的产品。 我们命令材料做出更合理的决定(实际上是一种幻想),这使我们对结果更有信心。

但是有一个问题:世界是混乱的,天生就是混乱的(至少从我们的人类感知来看)。 如今的数据凌乱且过多,这是一个非常糟糕的组合。 我们如何以对我们有意义的方式订购这个巨大的信息漩涡? 这是计算机排序算法发挥关键作用的地方。

排序算法的世界

简单来说, 算法是解决问题的逐步方法 。 算法基于获取输入并执行一系列指定操作以达到结果的结果。 它们广泛用于计算机编程,数学甚至我们的日常生活中(例如,烹饪食谱就是一种算法)。

算法早在计算机发明之前就已存在,但是自从现代技术爆炸以来,计算机算法已经在各处扩展和复制。 现在,从庞大的计算机算法领域来看,我认为排序算法值得一章。

排序算法是计算机科学的基础。 他们将无序数据转换为按某些标准排序的数据 ,例如字母顺序,最高到最低值或最短到最长距离。

他们基本上将项目列表作为输入,对这些列表执行特定操作,并以有序方式将这些项目作为输出。 排序算法的许多应用包括在零售网站上按价格组织商品并在搜索引擎结果页面上确定网站的顺序

那里有许多不同的排序算法,但是它们共有的一件事是,在可视化时可以更好地理解它们。 在以下示例中,我们采用一个无序列表,并使用5种不同的算法对其进行排序选择排序插入排序气泡排序合并排序快速排序 。 让我们来看看。

选择排序

选择排序算法基于以下想法:在未排序列表中找到最小或最大元素,然后以排序方式将其放置在正确的位置。 如果以升序排序,则最小的元素将首先出现;如果以降序排序,则最大的元素将是开始。

因此,以升序排序时,选择排序的工作方式是从列表的未排序部分中反复查找最小元素并将其放在开头。 在每次迭代中,都会从列表的未排序部分中选取最小元素,并将其移至列表的已排序部分。 为了做到这一点,该算法在通过时寻找最小值(在升序的情况下),并在完成通过之后将其放置在适当的位置。

看上面的例子。 需要按升序排序的列表分为两部分,左端是排序部分,右端是未排序部分。 最初,已排序部分为空,未排序部分为整个列表。 从未排序的列表中选择最小的元素(在这种情况下为2)(以洋红色标记),并与最左边的元素交换,该元素成为排序数组的一部分(现在为橙色)。 通过将未排序元素从未排序列表逐一移动到已排序元素,继续进行此过程,直到不再剩余元素为止。

选择排序非常直观,但是由于它需要扫描整个列表以查找下一个较小的值,因此在处理大量数据时可能会很慢。

插入排序

您是否曾经在游戏中对扑克牌进行排序? 如果答案是肯定的,那就是插入排序。

像选择排序中一样,插入排序将元素分为已排序和未排序列表。 在这种算法中,元素被顺序搜索,未排序的项目被移动并插入到已排序的列表中,直到覆盖所有未排序的值。

在我们的示例中,算法从左开始,将第一个元素(29)标记为已排序。 然后,它选择位于未排序列表中的第二个元素(10),并将其与放在已排序列表中的前一个元素进行比较。 由于10小于29,因此它将较高的元素向右移动,并在第一个位置插入较小的元素。 现在,元素10和29代表排序列表。 该算法通过从右侧的未排序列表中提取元素并将其与左侧的排序列表中的元素进行比较,从而找出插入位置的顺序来依次执行此练习。

插入排序是自适应的,这意味着如果提供部分排序的数组作为输入,它将减少步骤的总数,从而使其效率更高。 与选择排序类似,插入排序不适用于与其他排序算法不兼容的大数据量。

气泡排序

冒泡排序基于以下思想:反复比较成对的相邻元素,然后以错误的顺序交换它们的位置。

如果必须按升序对元素列表进行排序,则冒泡排序将通过将列表的第一个元素与第二个元素进行比较开始。 如果第一个元素大于第二个元素,它将交换两个元素并继续比较第二个和第三个元素,依此类推。

在我们的示例中,该算法从比较第一个元素(29)和第二个元素(10)开始。 由于29大于10,它将交换它们并将29作为列表中的第二个元素。 然后,它对第二个元素(29)和第三个元素(14)执行相同的操作,并在所有列表元素中重复此操作。 结果,列表(41)中的最高元素将在第一遍中位于列表的末尾(右侧)。 该算法将对所有元素进行多次遍历,直到对它们进行排序,然后将每个元素“冒泡”到其所属的位置。

气泡排序通常被认为是效率低下的排序工具,因为它必须在知道元素的最终位置之前交换项目。 但是,如果在通过过程中没有交换,那么我们知道该列表必须进行排序。 如果发现列表已排序,可以将Bubble Sort修改为尽早停止,从而使它能够识别已排序的列表。

合并排序

合并排序是一种非常有效的算法,可以将元素列表等分为两半,然后以排序的方式将它们组合在一起。

该算法首先将列表重复细分为几个子列表,直到每个子列表由一个元素组成并且无法再拆分(创建1个元素的分区)。 每个子列表的第一个元素在它们之间进行比较,如果按升序排序,则两者中的较小元素将成为新的合并排序列表的新元素。 重复此过程,直到所有子列表都为空,并且一个新合并的列表覆盖了所有子列表的所有元素,从而形成了一个排序列表。

这里的秘密是,已经对具有单个元素的列表进行了排序,因此一旦将原始列表分解为仅具有单个元素的子列表,我们就可以成功地将问题分解为基本问题。 这种方法称为“分而治之” ,它基于将单个大问题分解为较小的子问题,解决较小的子问题并结合其解决方案以找到原始大问题的解决方案的想法。 。

在我们的示例中,该算法首先将元素列表划分为1的分区。然后,它将第一个(29)和第二个(10)元素合并,对其进行排序(在这种情况下,以升序排列),然后将它们放回名单。 然后,它合并第一个(现在是10个),第二个(现在是29个)和第三个(14个)元素,对它们进行排序,然后将它们放回列表中。 它对所有子列表执行此过程,合并子结果,直到达到一个唯一的排序列表。

由于“合并排序”将输入分成多个块,因此可以并行并行地对每个输入进行排序,从而产生极快的结果。

快速排序

QuickSort是最有效的排序算法之一,它基于将数据集拆分为子组的子组,然后将子组递归地分成较小的组以优化排序过程。 该算法的工作原理是在数据集中找到一个“枢轴元素” ,并将其用作排序的基础。

快速排序还使用“分而治之”的方法对枢轴周围的元素进行划分和组织,以便:枢轴的左侧包含小于枢轴元素的所有元素,而右侧包含大于枢轴元素的所有元素比枢轴(称为“分区” )大。 这样,枢轴值首先将整个元素分为两部分,然后通过为每个细分找到一个枢轴来递归工作,直到所有细分只包含一个元素。

在上面的示例中,未排序分区的第一个元素被选作枢轴元素(以黄色突出显示)。 较小的元素以绿色标记并在左侧排序,较高的元素以紫色突出显示并在右侧排序。

让我们看看序列。 首先,选择29(左侧的第一个元素)作为枢轴。 当枢轴放置在适当的位置时,所有小于其的元素都放置在左侧(一个子组),而比它高的元素放置在右侧(另一个子组)。 然后,选择5(左侧未排序列表的第一个元素)作为新的枢轴元素,然后整个过程进行迭代,直到对该侧进行排序为止。

对左侧组进行排序后,该算法将移至右侧未排序组,并选择41(左侧的第一个元素)作为枢轴,并在此侧执行相同的过程,直到整个数据集从最低到最高排序。

在“快速排序”中,可以选择数据集中的任何元素作为枢轴:第一个元素,最后一个或任何其他随机元素。 那么最好的办法是什么? 与往常一样,没有一个直接的解决方案,它实际上取决于您要解决的问题。 您可以:

  1. 始终选择第一个元素作为枢轴
  2. 始终选择最后一个元素作为枢轴
  3. 选择一个随机元素作为枢轴
  4. 选择中位数作为枢轴

如果分区后产生的细分不平衡(这意味着枢轴一侧上的元素很少,而另一侧上的元素很多),则快速排序将花费更多时间来完成。 为避免这种情况,您可以选择随机的枢轴元素,并分散获得不平衡分区的风险。

选择哪一个?

自然,计算机科学家不断发明具有自己优点和缺点的其他排序算法,因此请仔细选择您的排序算法。 选择正确的排序算法,您的程序可以快速运行。 选择错误的排序算法,您的程序对用户来说似乎太慢了。 通常,“插入排序”最适合小型列表,“气泡排序”最适合于几乎已排序的列表,而“快速排序”通常对于日常使用来说最快。

可以理解:某些算法可以快速地管理相对较少的项目,但是如果强迫它们来管理大量的项目,则会很快放慢速度。 另一方面,其他算法在排序最初几乎正确排序的项目时非常快速高效,但如果对您随机分散在列表中的项目进行排序,则速度很慢。

但是,如果您能充分利用每个优点,该怎么办? 混合算法是必经之路。

混合算法结合了两个或多个其他解决相同问题的算法,可以选择一个,也可以在整个处理过程之间进行切换。

这样做是为了组合每个组件的期望功能,因此总体性能要比单个组件的总体性能更好。 例如, Tim Sort是从“合并排序”和“插入排序”派生的混合排序算法,旨在在现实世界的数据上实现高性能。 该算法查找已排序的数据的子序列(称为“自然运行”),并使用它们对其余部分进行更有效的排序。

对这些主题感兴趣? 在LinkedinTwitter上关注我

翻译自: https://hackernoon.com/essential-programming-sorting-algorithms-01r36ee

shell编程排序算法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值