1

在堆排序中,如果所有元素都只有0和1,那么与随机元素的正常情况相比,复杂度会发生变化吗?

4

3 回答 3

2

堆排序的运行时间由两部分决定:

  • 构建堆所需的时间为 Θ(n),以及
  • 从堆中连续删除元素所需的时间,(通常)是 Θ(n log n)

在所有值都是 0 或 1 的情况下,第二步的运行时间仍有可能是 Ω(n log n)。假设你的堆的结构是底层的所有元素都是 1,其他层的所有元素都是 0。在这种情况下,前 n 次你删除一个元素并尝试修复堆,你会将 1 交换到根,然后不断地将 1 向下冒泡到树的底部,这需要时间 Θ(日志 n)。这意味着完成的功至少为 Ω(n log n)。

正如@SRF 指出的那样,这里没有必要使用堆排序。您可以使用计数排序将数组排序为 Θ(n) 时间。

希望这可以帮助!

于 2013-11-01T01:36:53.783 回答
1

堆排序保证任何输入的时间复杂度为 O(n*lgn)。

但是,如果您知道数组的所有元素都仅限于“0”和“1”,那么您可以以 O(n) 时间复杂度对该数组进行排序。(尝试“计数排序”)

于 2013-10-04T09:01:49.877 回答
0

您不应该使用 HeapSort 对 1 和 0 进行排序。有一个 O(n) 算法。(使用 ES6)

const sorter = (input) => {
  let left = 0, right = input.length -1;
  while (right > left) {

    while (input[left] === 0 && right > left){
        left ++;
    }
    while (input[right] === 1 && right > left){
        right --;
    }
    if (input[left] > input[right]) {
      [input[left], input[right]] = [input[right], input[left]];
    }
    right--; left++;
  }
  return input;
}
于 2016-08-28T18:39:17.213 回答