我们可以知道一个集合是否几乎没有应用排序算法进行排序?

时间:2012-08-29 00:57:45

标签: bubble-sort sorting

在wikipedia关于排序算法的文章中, http://en.wikipedia.org/wiki/Sorting_algorithm#Summaries_of_popular_sorting_algorithms  在冒泡排序下,它说:冒泡排序也可以有效地用在几乎排序的任何长度的列表上(也就是说,元素不是很明显不合适)

所以我的问题是:如果不首先使用排序算法对列表进行排序,那么如何知道是否接近排序

2 个答案:

答案 0 :(得分:0)

您熟悉一般排序下限吗?您可以证明,在基于比较的排序算法中,任何排序算法都必须在平均情况下进行Ω(n log n)比较。你证明这一点的方式是通过信息论的论证。基本的想法是有n!输入数组的可能排列,并且因为你可以了解你得到的排列的唯一方法是进行比较,你必须至少制作lg n!比较,以确保您知道输入排列的结构。

我还没有计算出这个数学,但我怀疑你可以做出类似的论证来证明很难学习特定数组的排序方式。从本质上讲,如果你不进行大量的比较,那么你将无法区分一个主要从实际上远离排序的数组中排序的数组。因此,我所知道的衡量“排序”的所有算法都需要相当长的时间才能完成。

例如,数组中“排序”级别的一个度量是该数组中inversions的数量。您可以使用基于mergesort的分治算法在时间O(n log n)中计算数组中的反转次数,但是使用该运行时,您可以改为对数组进行排序。

通常情况下,您知道阵列主要分类的方式是先了解一下它是如何生成的。例如,如果您正在查看从上午8点到下午12点收集的温度数据,则很可能数据已经大部分已经排序(以传感器读数质量的某些变化为模)。如果您的数据随着时间的推移查看股票价格,那么除非公司有一个非常糟糕的轨迹,否则它也可能大部分都是排序的。一些其他算法也部分排序数组;例如,快速排序实现在排序为sort的数组的大小很小时停止排序并且通过最终插入排序传递跟随所有内容并不罕见,因为每个元素都不会离它的最终位置很远。

答案 1 :(得分:0)

我不相信存在任何关于数组排序或随机的标准化度量。

你可以提出自己的测量 - 比如计算乱序的相邻对的数量(在评论中建议),或计算在数组中较小数字之前出现的较大数字的数量(这比一个简单的单程)。