假设这里考虑的算法按升序对输入序列进行排序。如果输入已经按升序排列,以下哪些是 TRUE ?
I. Quicksort runs in Θ(n2) time
II. Bubblesort runs in Θ(n2) time
III. Mergesort runs in Θ(n) time
IV. Insertion sort runs in Θ(n) time
(A)仅 I 和 II
(B)仅 I 和 III
(C)仅 II 和 IV
(D)仅 I 和 IV答案: (D)
说明: I.给定一个按升序排列的数组,快速排序总比较次数的递归关系为
T(n) = T(n-1)+O(n) //分区算法在任何情况下都会进行 O(n) 次比较。
= O(n^2)
二、冒泡排序在 Θ(n^2) 时间内运行
如果数组是按升序排列的,我们可以在冒泡排序内部 for 循环中做一个小的修改,它负责在第 k 次迭代中冒泡第 k 个最大的元素到末尾。每当在任何迭代中完成冒泡排序的内部循环后没有交换时,我们可以声明数组已排序,以防冒泡排序在最佳情况下花费 O(n) 时间。
三、合并排序在 Θ(n) 时间内运行
归并排序依赖于分而治之的范式来对数组进行排序,并且归并排序没有最坏或最好的输入。对于任何序列,时间复杂度将通过以下递推关系给出,
T(n) = 2T(n/2) + Θ(n) // 由于复制整个数组,就地合并算法将占用 Θ(n)。
= Θ(nlogn)
四、插入排序在 Θ(n) 时间内运行
每当添加一个大于中间排序子数组(因为给定数组已排序)的所有元素的新元素时,将不会进行任何交换,而是进行一次比较。在 n-1 次传递中,我们将进行 0 次交换和 n-1 次比较。
总时间复杂度 = O(n) // N-1 次比较
此解决方案由Pranjul Ahuja 提供
////
对于已经按升序排序的数组,
快速排序的复杂度为 Θ(n 2 ) [最坏情况]
冒泡排序的复杂度为 Θ(n) [最佳情况]
Mergesort 有一个复杂度 Θ(n log n) [Any Case]
插入排序的复杂度为 Θ(n) [最佳情况]这个问题的测验