列表已排序时合并排序中的比较次数

时间:2016-01-25 18:51:42

标签: sorting

假设输入列表已按递增顺序排序。在这种情况下,比较的数量是多少。如果输入列表按元素数量的相反顺序排序,那该怎么办呢?

我认为如果列表已经排序,将需要(n / 2)lg n。对于例如如果我们有一个列表如:1,2,3,4,5,6,7,8,9,10,已经排序,那么它将分为(1,2,3,4,5)和( 6,7,8,9,10)部分。此外,该清单将分为(1,2,3),(4,5),(6,7,8),(9,10)等。现在,叶子已经排序,我们必须在合并期间仅将第一个列表的第一个元素与其他列表的所有元素进行比较。对于例如在(1,2,3,4,5)和(6,7,8,9,10)的情况下,我们将比较1与第二列表中的所有元素,类似地2对所有元素等等。因此在1级我们有n / 2个比较,在2级我们有两个n / 4比较(总共n / 2),依此类推。由于有lg n(基数2)水平,我们将总共进行(n / 2)* lg n次比较。

1 个答案:

答案 0 :(得分:2)

我认为答案应该是(n / 2)logn。在合并排序的每个递归级别中,我们至少需要进行(n / 2)个比较。由于存在用于合并排序的登录级别,因此答案总共是(n / 2)个登录比较。

更具体地说,我们可以举一个例子: (1、2、3、4、5、6、7、8、9、10、11、12、13、14、15、16) 8个比较:将9与1、2、3、4、5、6、7、8进行比较 (1、2、3、4、5、6、7、8)(9、10、11、12、13、14、15、16) 8个比较:将5与1、2、3、4比较,并将13与9、10、11、12比较 (1、2、3、4)(5、6、7、8)(9、10、11、12)(13、14、15、16) 8个比较:比较3与1和2,比较7与5和6,比较11与9和10,比较15与13和14 (1、2)(3、4)(5、6)(7、8)(9、10)(11、12)(13、14)(15、16) 8个比较:将1与2、3与4、5与6、7与8、9与10、11与12、13与14、15与16进行比较。 (1)(2)(3)(4)(5)(6)(7)(8)(9)(10)(11)(12)(13)(14)(15)(16)

此外,在最坏的情况下,总共将进行nlogn比较。例如,原始数组颠倒了。