Algorithm 是“快速排序”;“自适应”;及;在线;?
也就是说,当给定一个已经排序的列表时,快速排序的性能更好吗?我不明白为什么会出现这种情况,但也许我不完全理解算法 此外,当我们在排序时向列表中添加新数据时,快速排序能否“继续”?在我看来,算法在开始时需要所有数据的完整集合才能“工作” 当给定一个已经排序的列表时,快速排序的性能更好吗 我认为quicks sort的性能主要取决于在每个步骤中选择的枢轴元素。如果选定的枢轴元素可能是列表中最小或最大的元素,则情况最糟糕 快速排序“继续”,同时向列表中添加新数据 分类 是的,快速排序不是自适应的。这是快速排序的特性 当给定一个已经排序的列表时,快速排序的性能更好吗 不,事实上,它通常被教导的方式(使用第一个元素作为轴心)已经排序(或接近排序)的列表是最坏的情况。但是,使用中间元素或随机元素作为轴心可以缓解这种情况 当我们在排序时向列表中添加新数据时,快速排序能否“继续”Algorithm 是“快速排序”;“自适应”;及;在线;?,algorithm,sorting,quicksort,Algorithm,Sorting,Quicksort,也就是说,当给定一个已经排序的列表时,快速排序的性能更好吗?我不明白为什么会出现这种情况,但也许我不完全理解算法 此外,当我们在排序时向列表中添加新数据时,快速排序能否“继续”?在我看来,算法在开始时需要所有数据的完整集合才能“工作” 当给定一个已经排序的列表时,快速排序的性能更好吗 我认为quicks sort的性能主要取决于在每个步骤中选择的枢轴元素。如果选定的枢轴元素可能是列表中最小或最大的元素,则情况最糟糕 快速排序“继续”,同时向列表中添加新数据 分类 是的,快速排序不是自适应的。这是
不,您的直觉是正确的,您从一开始就需要整个数据集。当快速排序的枢轴选择是随机的时,它的运行时间为O(n lg n),其中n是数组的大小。如果按排序顺序选择数据透视,则其运行时将降级为O(n^2)。无论是从左侧、右侧、中间还是随机选择轴,这都无关紧要,因为可以(如果不可能)按排序顺序选择轴 避免这种情况的唯一方法是通过使用诸如“三个中间值”之类的技术来确保枢轴不整齐
根据Robert Sedgewick,Algorithms,Addison-Wesley Publishing Company,1988年,第124页,如果您使用三位数技术选择轴并停止小分区的递归(大小从5到25;这会使数组未排序,但可以通过插入排序快速完成)然后QueQuad将总是O(n LG n),而且比普通QuasRoad更快地运行20%。这是什么来源?“使用中间”-我想你是指中值,如果你总是使用数组中间的元素,我们可以构造最坏的情况,没有问题。是的,我们可以为它构造最坏的情况,但是它们比排序数组的可能性要小得多,在较大的数组中概率非常小。@G.Bach如果您使用median,那么您可以保证
O(logn)
迭代,但quicksort不能保证这一点。快速排序是O(n^2)
。每次查找中位数比可能的少量额外迭代更昂贵。@Kevin“它们比排序数组的可能性要小得多”-我非常怀疑,我希望对于所有类型的策略“在数组中取第k个元素”,最坏情况下的排列数完全相同。除非你所说的“可能”是指其他意思。@G.Bach当然,最坏情况下的排列数是相同的,是的,但我坚持认为,在实践中,对于一般实现(例如qsort()
)而言,选择中间最坏情况的数组比(几乎)排序的数组的可能性要小得多。