Algorithm 快速排序算法-做同一件事的许多不同方法?

Algorithm 快速排序算法-做同一件事的许多不同方法?,algorithm,sorting,quicksort,Algorithm,Sorting,Quicksort,我说有很多方法可以执行快速排序,对吗 为了便于论证,让我们使用第一本教科书的数字: 2047 12 53 32 84 85 96 45 18 这本书说要把18号和20号互换(书中20号是红色的,18号是蓝色的,所以我把20号加粗) 基本上,它会一直移动蓝色指针,直到数字为: 18 122053 32 84 85 96 45 47 现在它说(对我来说这是显而易见的)20中左边的所有数字都小于,右边的所有数字都大于,但它从未将20命名为“支点”,这是大多数其他资源所谈论的。然后,正如所有其他方法所述

我说有很多方法可以执行快速排序,对吗

为了便于论证,让我们使用第一本教科书的数字: 2047 12 53 32 84 85 96 45 18

这本书说要把18号和20号互换(书中20号是红色的,18号是蓝色的,所以我把20号加粗)

基本上,它会一直移动蓝色指针,直到数字为: 18 122053 32 84 85 96 45 47

现在它说(对我来说这是显而易见的)20中左边的所有数字都小于,右边的所有数字都大于,但它从未将20命名为“支点”,这是大多数其他资源所谈论的。然后,正如所有其他方法所述,它在两个方面进行快速排序,然后我们得到(它只包括对列表的右半部分进行排序):

47324553968584本书到此结束。现在我从其他资源中了解到,一旦所有列表都按顺序排列,它们就会重新组合在一起。我想我理解这一点,但我经常被一本“剑桥认可”的教科书弄糊涂,这本教科书与第二本不同。第二个是关于通过选取中间值来寻找轴心点


为列表找到“轴心”的最佳方法是什么?

理论上-选择元素作为轴心可以保证最少的递归调用次数,并保证
Theta(nlogn)
运行时间。
然而,找到这个中位数是用——如果你想保证选择需要线性时间——它需要算法,而算法的常数很差

如果您选择第一个(或最后一个)元素作为枢轴,那么对于排序或几乎排序的数组,您的性能肯定会很差,在许多应用程序中,这很可能是您的输入数组,所以这也不是一个好的选择。因此,选择数组的第一个/最后一个元素实际上是个坏主意

选择枢轴的良好固溶体是随机的。从
r=rand([0,长度(数组))
中绘制一个随机数,并选择第r个元素作为轴心

虽然理论上存在最坏情况的可能性,但它是:

  • 不太可能
  • 恶意用户很难预测最坏情况下的输入,尤其是在他不知道随机函数和/或种子的情况下

  • 你的教科书中给出的概念与基于轴心的概念相似,只是他们没有提到这个术语。但是,无论如何,这些概念是相同的

    找到列表“轴心点”的最佳方法是什么

    选择关键元素没有固定的方法。你可以选择数组中的任何元素——第一个、第二个、最后一个等等。也可以为给定的数组随机选择

    但是,出于基于对称性的原因,科学家和数学家通常会讨论中间元素,它是列表的中间元素,从而减少递归调用


    很明显,当您选择数组的第一个或最后一个元素时,递归调用的数量将更多,从而更接近最坏的情况。递归调用的数量将更多,以分别在两个分区上执行快速排序。

    您建议的标记将不适用于本网站。有关标签的更多信息,请参见此处:这是一个人的观点。作为高中教师,我们经常得不到足够的资源,或者不得不在互联网上寻找太多的资源。我们正在教学生如何在一个需要更多IT培训人员的行业中编程。也许剑桥是一个不正确的标签,如何关于“高中教师”或“中学教师”?如果你想了解更多的意见,包括网站的负责人,请查看Meta。它就在某个地方。本案例的标准问题是:有人能成为了解“高中教师”一切的专家吗?不?那么它就不会得到标签。排序算法方面的专家是可能的,等等,但老师是不可能的。这不会有用。没有人在乎你问什么,因为你是剑桥的老师,人们只关心这个问题。而且没有人会搜索“老师问的问题”,但是关于快速排序的问题。我链接的关于标签的页面表明标签应该描述问题的内容。如果标签不能作为问题上的唯一标签,就不应该使用它。更多详细信息,谢谢你,如果我有足够的分数,我会将你的答案列为有用的!@Chris谢谢你的赞赏。另外,你可以投票给我的答案稍后回答,当你获得15个声望时,现在你有8个。