shell编程排序算法_基本编程:排序算法
shell编程排序算法
⽇历中的下⼀个任务,您最喜欢的运动队在联盟中的排名,⼿机中的联系⼈列表,所有这些都有⼀个订单。 当我们处理信息时,顺序很重要。 我们使⽤秩序来理解我们的⽣活并优化我们的决策。 想象⼀下在字典中按字母混合顺序查单词,或者尝试在⽆序的定价表中查最便宜的产品。 我们命令材料做出更合理的决定(实际上是⼀种幻想),这使我们对结果更有信⼼。
但是有⼀个问题:世界是混乱的,天⽣就是混乱的(⾄少从我们的⼈类感知来看)。 如今的数据凌乱且过多,这是⼀个⾮常糟糕的组合。我们如何以对我们有意义的⽅式订购这个巨⼤的信息漩涡? 这是计算机排序算法发挥关键作⽤的地⽅。
排序算法的世界
简单来说, 算法是解决问题的逐步⽅法 。 算法基于获取输⼊并执⾏⼀系列指定操作以达到结果的结果。 它们⼴泛⽤于计算机编程,数学甚⾄我们的⽇常⽣活中(例如,烹饪⾷谱就是⼀种算法)。
算法早在计算机发明之前就已存在,但是⾃从现代技术爆炸以来,计算机算法已经在各处扩展和复制。 现在,从庞⼤的计算机算法领域来看,我认为排序算法值得⼀章。
排序算法是计算机科学的基础。 他们将⽆序数据转换为按某些标准排序的数据 ,例如字母顺序,最⾼到最低值或最短到最长距离。
他们基本上将项⽬列表作为输⼊,对这些列表执⾏特定操作,并以有序⽅式将这些项⽬作为输出。 排序算法的许多应⽤包括在零售⽹站上按价格组织商品并在搜索引擎结果页⾯上确定⽹站的顺序
那⾥有许多不同的排序算法,但是它们共有的⼀件事是,在可视化时可以更好地理解它们。 在以下⽰例中,我们采⽤⼀个⽆序列表,并使⽤5种不同的算法对其进⾏排序 : 选择排序 , 插⼊排序 , ⽓泡排序 , 合并排序和快速排序 。 让我们来看看。
选择排序
选择排序算法基于以下想法:在未排序列表中到最⼩或最⼤元素,然后以排序⽅式将其放置在正确的位置。 如果以升序排序,则最⼩的元素将⾸先出现;如果以降序排序,则最⼤的元素将是开始。
因此,以升序排序时,选择排序的⼯作⽅式是从列表的未排序部分中反复查最⼩元素并将其放在开头。 在每次迭代中,都会从列表的未排序部分中选取最⼩元素,并将其移⾄列表的已排序部分。 为了做到这⼀点,该算法在通过时寻最⼩值(在升序的情况下),并在完成通过之后将其放置在适当的位置。
看上⾯的例⼦。 需要按升序排序的列表分为两部分,左端是排序部分,右端是未排序部分。 最初,已排序部分为空,未排序部分为整个列表。 从未排序的列表中选择最⼩的元素(在这种情况下为2)(以洋红⾊标记),并与最左边的元素交换,该元素成为排序数组的⼀部分(现在为橙⾊)。 通过将未排序元素从未排序列表逐⼀移动到已排序元素,继续进⾏此过程,直到不再剩余元素为⽌。
选择排序⾮常直观,但是由于它需要扫描整个列表以查下⼀个较⼩的值,因此在处理⼤量数据时可能会很慢。
插⼊排序
您是否曾经在游戏中对扑克牌进⾏排序? 如果答案是肯定的,那就是插⼊排序。
像选择排序中⼀样,插⼊排序将元素分为已排序和未排序列表。 在这种算法中,元素被顺序搜索,未排序的项⽬被移动并插⼊到已排序的列表中,直到覆盖所有未排序的值。
在我们的⽰例中,算法从左开始,将第⼀个元素(29)标记为已排序。 然后,它选择位于未排序列表中的第⼆个元素(10),并将其与放在已排序列表中的前⼀个元素进⾏⽐较。 由于10⼩于29,因此它将较⾼的元素向右移动,并在第⼀个位置插⼊较⼩的元素。 现在,元素10和29代表排序列表。 该算法通过从右侧的未排序列表中提取元素并将其与左侧的排序列表中的元素进⾏⽐较,从⽽出插⼊位置的顺序来依次执⾏此练习。
插⼊排序是⾃适应的,这意味着如果提供部分排序的数组作为输⼊,它将减少步骤的总数,从⽽使其效率更⾼。 与选择排序类似,插⼊排序不适⽤于与其他排序算法不兼容的⼤数据量。
⽓泡排序
冒泡排序基于以下思想:反复⽐较成对的相邻元素,然后以错误的顺序交换它们的位置。
如果必须按升序对元素列表进⾏排序,则冒泡排序将通过将列表的第⼀个元素与第⼆个元素进⾏⽐较开始。 如果第⼀个元素⼤于第⼆个元素,它将交换两个元素并继续⽐较第⼆个和第三个元素,依此类推。sort命令排序
在我们的⽰例中,该算法从⽐较第⼀个元素(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. 选择中位数作为枢轴
如果分区后产⽣的细分不平衡(这意味着枢轴⼀侧上的元素很少,⽽另⼀侧上的元素很多),则快速排序将花费更多时间来完成。 为避免这种情况,您可以选择随机的枢轴元素,并分散获得不平衡分区的风险。
选择哪⼀个?
⾃然,计算机科学家不断发明具有⾃⼰优点和缺点的其他排序算法,因此请仔细选择您的排序算法。 选择正确的排序算法,您的程序可以快速运⾏。 选择错误的排序算法,您的程序对⽤户来说似乎太慢了。 通常,“插⼊排序”最适合⼩型列表,“⽓泡排序”最适合于⼏乎已排序的列表,⽽“快速排序”通常对于⽇常使⽤来说最快。
可以理解:某些算法可以快速地管理相对较少的项⽬,但是如果强迫它们来管理⼤量的项⽬,则会很快放慢速度。 另⼀⽅⾯,其他算法在排序最初⼏乎正确排序的项⽬时⾮常快速⾼效,但如果对您随机分散在列表中的项⽬进⾏排序,则速度很慢。
但是,如果您能充分利⽤每个优点,该怎么办? 混合算法是必经之路。
混合算法结合了两个或多个其他解决相同问题的算法,可以选择⼀个,也可以在整个处理过程之间进⾏切换。
这样做是为了组合每个组件的期望功能,因此总体性能要⽐单个组件的总体性能更好。 例如, 是从“合并排序”和“插⼊排序”派⽣的混合排序算法,旨在在现实世界的数据上实现⾼性能。 该算法查已排序的数据的⼦序列(称为“⾃然运⾏”),并使⽤它们对其余部分进⾏更有效的排序。
对这些主题感兴趣? 在或关注我

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。