Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript O(n)时间内(1,2,3)个数的排序数组_Javascript_Algorithm_Sorting_Big O - Fatal编程技术网

Javascript O(n)时间内(1,2,3)个数的排序数组

Javascript O(n)时间内(1,2,3)个数的排序数组,javascript,algorithm,sorting,big-o,Javascript,Algorithm,Sorting,Big O,给定一个只有3个唯一数字(1、2、3)的数字列表,按O(n)时间对列表进行排序。加上使用常量空间对数组排序O(1) 示例: 输入:[3,3,2,1,3,2,1] 输出:[1,1,2,2,3,3,3] 这里是我提出的解决方案(没有O(1)空间,数组中有空格..): 这个函数的作用很简单。。在所有元素都为2的情况下,将排列的大小增加一倍;然后,它将转到其上一个长度(当前/2)对其元素进行排序。。如果它是1,它什么也不做,如果它找到一个2,它把它放在前一个最大长度+1中,它增加变量len并删除元素,如

给定一个只有3个唯一数字(1、2、3)的数字列表,按O(n)时间对列表进行排序。加上使用常量空间对数组排序O(1)

示例:

输入:[3,3,2,1,3,2,1]

输出:[1,1,2,2,3,3,3]

这里是我提出的解决方案(没有O(1)空间,数组中有空格..): 这个函数的作用很简单。。在所有元素都为2的情况下,将排列的大小增加一倍;然后,它将转到其上一个长度(当前/2)对其元素进行排序。。如果它是1,它什么也不做,如果它找到一个2,它把它放在前一个最大长度+1中,它增加变量len并删除元素,如果它是3,则推送并删除元素。。然后数组中有空的空格,不满足问题的加号,但它是O(n)

函数排序(列表){
设len=list.length;
list.length=len*2

对于(设i=0;i,因为您知道数组只能包含3项,所以您可以为每个项迭代整个数组(这意味着算法运行3*n次=
O(3n)=O(n)

空间限制表示您需要就地工作,即在输入阵列上工作

这是我的解决方案:]

功能交换(i、j、arr){
常数currentVal=arr[j];
arr[j]=arr[i];
arr[i]=currentVal;
}
函数排序(arr){
设globalIndex=0;
[1,2,3].forEach(项目=>{
for(设i=globalIndex;iconsole.log(a);
您可以计算1、2、3的出现次数,并使用该信息重新创建/获取排序数组:

const arr=[3,3,2,1,3,2,1]
常数计数=arr.reduce((acc,curr)=>{
acc[curr]++;
返回acc;
}, {1: 0, 2: 0, 3: 0})
arr.forEach((uj)=>{
如果(jconsole.log(arr)
您可以使用以下算法:

荷兰国旗问题是一个计算机科学编程问题,由(在他1976年出版的《编程的纪律》一章中)提出。该问题由三种颜色组成:红色、白色和蓝色。给定这三种颜色的球随机排列成一行(球的实际数量无关紧要),任务是将它们排列在一起,使所有相同颜色的球都在一起,并且它们的集合颜色组的顺序正确

var数组=[3,3,2,1,3,2,1],
MID=2,
i=0,
j=0,
n=数组长度-1;
while(j-MID){
[array[n],array[j]=[array[j],array[n]];
n--;
}否则{
j++;
}
}

console.log(array);
根据我的说法,对于每个1、2和3的计数,您可以简单地将三个变量初始化为0。遍历数组一次,并将每个索引处的值的相应计数器递增1,即,如果特定索引处的值为2,则将第二个变量递增1

一旦获得计数,(Count1-1)第次索引将是1的最后一次出现,(Count1+Count2-1)第次索引将是2的最后一次出现,(Count1+Count2+Count3-1)第次索引将是3的最后一次出现

您可以遍历整个数组并相应地分配值。
这种方法有点像计数排序,但当然不稳定。但是,正如前面的答案中所提到的,您还有另一种选择-

我采用了一种简单的蛮力方法,它在最后仍然给出O(n)。毕竟
O(2N)+O(3)=O(n)

导入系统 def分类(NUM): res={} mi=sys.maxsize ma=-1*sys.maxsize mid=0 对于以nums表示的i:#O(n) 如果我在res中: res[i]+=1 其他: res[i]=1 如果mi>i: mi=i 如果ma
向左移动一个。下一步,向右移动3个。O(n)时间,O(1)空间。不要删除任何内容。@Liam的可能重复项不是真正的重复项,因为这与通用排序无关。此外,还有很多很多其他重复项。不是
拼接
O(n)在最坏的情况下?不确定它是如何实现的,但听起来很像。编辑:是的,应该是,也证实了这一点。如果这是真的,那么我的算法不够好,但是你可以手动更改项目。实现
拼接的直接方法是删除元素,然后将所有后续元素提前移动到一个插槽中。我不知道是否有任何技巧可以改善这一点,但LinkedQuestion的基准表明“没有”.好的,有意义,我更新了我的答案,改为使用
swap
。非常感谢Nina,当我提出这个问题时,不知道这是最有用的方法,当保留球的身份很重要时,或者当需要维护除颜色以外的其他一些数据时。对于提出问题的情况,没有最重要的是,只计算每个值的出现次数更容易。多亏了Pulkit Jatav,问题在于计数和填充,而不是作为排序和数组计数
import sys

def sortNums(nums):
    res = {}
    mi = sys.maxsize
    ma = -1 * sys.maxsize
    mid = 0
    for i in nums: #O(n)
        if i in res:
            res[i] += 1
        else:
            res[i] = 1
        if mi > i:
            mi = i
        if ma < i:
            ma = i
    
    for ele in res.keys(): #O(3)
        if ele != mi and ele != ma:
            mid = ele

    return ([mi] * res[mi]) + ( [mid] * res[mid] ) + ([ma] * res[ma]) # O(n)

print(sortNums([3, 3, 2, 1, 3, 2, 1]))
# [1, 1, 2, 2, 3, 3, 3]