我不确定对象本身如何对数字进行排序,以及这是否会影响此算法的时间复杂度。这就是为什么我想知道这是否是线性的( 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;
};
答案 0 :(得分:3)
我不确定对象如何自动排序数字
不,他们没有。对象键顺序无法保证。因此,你实际上没有对任何东西进行排序:)
答案 1 :(得分:1)
这是潜在线性排序的要点。但是,它取决于几个实现要求。
首先,我想确保我理解这种方法:
storage
结构开头。这将计算arr
的每个元素的出现次数,由元素本身索引。例如,给定输入字符串“abaczaz”,storage
将完成为{'a': 3, 'b':1, 'c':1, 'z':2}
storage
;对于每个条目,发出所列数量的列出元素。对于当前的例子,这将产生“aaabczz”。这些迭代中的每一个都是长度 N ,这是一个线性解决方案。 但,请注意此操作的要求:
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)`
最后......
是的,这种方式已经实施。我把它作为一个面试问题。