这种排序算法是否已被发明?它是线性时间复杂度吗?

时间:2018-03-23 16:59:27

标签: javascript algorithm sorting object time-complexity

我不确定对象本身如何对数字进行排序,以及这是否会影响此算法的时间复杂度。这就是为什么我想知道这是否是线性的( O(n))。

我知道空间复杂性很糟糕。

这是我的代码:

const objSort = (arr) => {
  let storage = {};
  let sorted = [];
  let entries;

  arr.forEach((num) => {
    storage[num] ? storage[num]++ : storage[num] = 1;
  });

  entries = Object.entries(storage);

  entries.forEach(([ key, value ]) => {
    for (let i = 0; i < value; i++) {
      sorted.push(+key);
    }
  });

  return sorted;
};

2 个答案:

答案 0 :(得分:3)

  

我不确定对象如何自动排序数字

不,他们没有。对象键顺序无法保证。因此,你实际上没有对任何东西进行排序:)

答案 1 :(得分:1)

这是潜在线性排序的要点。但是,它取决于几个实现要求。

首先,我想确保我理解这种方法:

  • 以空白storage结构开头。这将计算arr的每个元素的出现次数,由元素本身索引。例如,给定输入字符串“abaczaz”,storage将完成为{'a': 3, 'b':1, 'c':1, 'z':2}
  • 遍历storage;对于每个条目,发出所列数量的列出元素。对于当前的例子,这将产生“aaabczz”。

这些迭代中的每一个都是长度 N ,这是一个线性解决方案。 ,请注意此操作的要求:

  • 您必须将对象映射到 O(1)的索引。
  • 该映射必须体现对象的排序顺序。
  • 进出storage的访问时间必须 O(1)
  • storage的迭代必须 O(N)

对于最后一点,大多数解决方案都是 O(范围(对象)),这个数字足够大,不切实际。例如,要对64位整数进行排序,您需要一个长度为2 ^ 64个内存位置的数组,并且您将遍历所有2 ^ 64个整数以发出已排序的数组。

当然,固定边界在技术上使 O(1),但对于非常大的1值。 :-)从理论上讲,它是 O(log(max(arr) - min(arr)),因为内存需求取决于值范围。这会将您的整体复杂性驱动为 O (n log n)`

最后......

是的,这种方式已经实施。我把它作为一个面试问题。