未知大小数组合并排序的比较次数
Number of comparisons Merge Sort of unknown size array
给定一个包含 n 个不同数字的数组,其中 n = 2^k,我如何找到并证明最小和最大比较次数?
比较将在不同的元素之间进行。
我在 SO 上看到了一些问题,但似乎与我要找的不相符。
所有比较都发生在递归的回溯步骤中,当合并两个相邻的已排序子数组时。
在最好的情况下,两个排序的子数组(每个子数组的大小均为 )可以按原样连接,一个接一个。在那种情况下,比较是在一个子数组的所有值与另一个子数组的单个值之间进行的,因此我们可以进行比较。
在最坏的情况下,两个排序的子数组需要交织在一起,这样最后的比较是在两个子数组中的最后两个值之间进行的。总共进行了 2−1 次比较。
现在我们需要将所有阶段的比较(分区大小)相加。
最佳 情况下,对具有元素 (2) 的数组进行比较的情况是:
0 + 1(/2) + 2(/4) + 4(/8) + ... + (/2)⋅1 = (/2)log2 = 2−1
最差 情况下的比较次数是其两倍(比较上面的第 2 项),减去:
/2 + /4 + /8 + ... + 1 = − 1
...所以我们得到:log2 − + 1 = (−1)2 + 1
总结
最佳情况:2−1
最坏情况:(−1)2 + 1
给定一个包含 n 个不同数字的数组,其中 n = 2^k,我如何找到并证明最小和最大比较次数?
比较将在不同的元素之间进行。
我在 SO 上看到了一些问题,但似乎与我要找的不相符。
所有比较都发生在递归的回溯步骤中,当合并两个相邻的已排序子数组时。
在最好的情况下,两个排序的子数组(每个子数组的大小均为 )可以按原样连接,一个接一个。在那种情况下,比较是在一个子数组的所有值与另一个子数组的单个值之间进行的,因此我们可以进行比较。
在最坏的情况下,两个排序的子数组需要交织在一起,这样最后的比较是在两个子数组中的最后两个值之间进行的。总共进行了 2−1 次比较。
现在我们需要将所有阶段的比较(分区大小)相加。
最佳 情况下,对具有元素 (2) 的数组进行比较的情况是:
0 + 1(/2) + 2(/4) + 4(/8) + ... + (/2)⋅1 = (/2)log2 = 2−1
最差 情况下的比较次数是其两倍(比较上面的第 2 项),减去:
/2 + /4 + /8 + ... + 1 = − 1
...所以我们得到:log2 − + 1 = (−1)2 + 1
总结
最佳情况:2−1
最坏情况:(−1)2 + 1