Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 了解合并排序和快速排序的运行时间_Algorithm_Sorting_Big O_Quicksort_Mergesort - Fatal编程技术网

Algorithm 了解合并排序和快速排序的运行时间

Algorithm 了解合并排序和快速排序的运行时间,algorithm,sorting,big-o,quicksort,mergesort,Algorithm,Sorting,Big O,Quicksort,Mergesort,对于合并排序和快速排序,我试图提出它们成为最坏情况的场景。如果我是正确的,当所有内容都已排序时,合并排序的最坏情况是O(nlogn)。快速排序的最坏情况是当枢轴位于最不理想的位置时,数组被排序,因此它变成O(n^2)。我想知道这是不是正确的第一次,所以请纠正我,如果不是。 我真正的问题是,如果快速排序的枢轴在数组的中间,数组看起来是什么样的,以便它是O(n ^ 2)?< p>最快排序的最坏情况是当枢轴小于或大于要被排序的所有其他值时。在这种情况下,每个递归级别的剩余值中只删除1项,时间复杂度最终

对于合并排序和快速排序,我试图提出它们成为最坏情况的场景。如果我是正确的,当所有内容都已排序时,合并排序的最坏情况是O(nlogn)。快速排序的最坏情况是当枢轴位于最不理想的位置时,数组被排序,因此它变成O(n^2)。我想知道这是不是正确的第一次,所以请纠正我,如果不是。
我真正的问题是,如果快速排序的枢轴在数组的中间,数组看起来是什么样的,以便它是O(n ^ 2)?

< p>最快排序的最坏情况是当枢轴小于或大于要被排序的所有其他值时。在这种情况下,每个递归级别的剩余值中只删除1项,时间复杂度最终为O(n^2)


对于基本合并排序,自上而下或自下而上,移动次数始终相同。比较的数量取决于数据模式。当合并两个大小均为n的运行时,最坏情况下的比较数为2n-1(当两个运行中除1外的每个元素都被比较时,当只剩下1个元素时,就没有什么可比较的了,所以它只是被复制),最好情况是当一个运行的所有元素都小于另一个运行的第一个元素时,在这种情况下,比较的数量为n,例如当数据已经排序或反向排序时。

您可以模拟快速排序,确保每次选择轴时,它连续为0、1、2、。。。以保证最坏情况下的性能

这假定使用一种常用的数据透视算法,该算法将在对数组进行分区之前将数据透视值交换到数组的开头。在本例中,由于我们选择的枢轴是剩余的最小项,因此不需要进行分区

以下是仿真代码:

class Cell:
    def set(self, v):
        self.v = v

def worst_case_quicksort(xs, i):
    xs = xs[:]
    for i in xrange(len(xs)):
        p = (len(xs) - i) // 2
        xs[i+p].set(i)
        xs[i], xs[i+p] = xs[i+p], xs[i]

xs = [Cell() for _ in xrange(20)]
worst_case_quicksort(xs, 0)
print [x.v for x in xs]
输出如下所示:

[1, 11, 3, 19, 5, 13, 7, 17, 9, 15, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

因此,如果在[1,2,3,4,5,6,7,8,9]的数组中的枢轴是5,因为它在中间,运行时间是O(n log n),因为5既不大于数组中的其他值也不小于数组中的所有其他值。此外,如果pivot仍然是5,数组类似于[7,8,9,10,5,11,12,13,14],因为pivot小于所有其他值,这是否是O(n^2)时间复杂度的示例?@Dinoman979-是,但对于O(n^2)时间复杂度,代码必须反复遇到中间轴小于或大于其余值的情况。如果代码选择中间值,则模式将很复杂,并且取决于通过递归调用传递的子数组中是否包含透视。