JavaScript 数组 : Algorithm sorting and picking

标签 javascript algorithm

在本例中,我有一个包含 4 个介于 0 和 256 之间的整数的数组,需要对其进行升序排序。例如:

[0, 12, 211, 4] 当我排序时,我得到(当然):[0, 4, 12, 211]

我只是通过请求Array[0](第一个索引)来获取整数值

现在,我的问题是;很多时候,数组中有相等的值。喜欢:

[0, 0, 0, 12] // already sorted

在这些情况下,我需要从最上面的相等值 (0,0,0) 中选择一个随机索引,其他可能性是(排序后):

[211, 211, 211, 255] // results in 0 OR 1 OR 2
[13, 13, 125, 256] // results in 0 OR 1
[4, 211, 211, 255] // results in 0 
[0, 1, 1, 4] // results in 0;

所以我需要从升序排序数组中最上面的值中选择一个随机索引。 这是在排序时完成的,还是比许多 if-elses 更简单的方式?

最佳答案

排序

如果速度很重要(您似乎暗示它很重要),那么您是否研究过排序网络?我发现在对少量数字进行排序时,它们的速度非常快。

使用排序网络进行排序:

Network for N=4, using Bose-Nelson Algorithm.

CreationDate: Tue Feb 15 04:44:06 2011 Creator: perl module Algorithm::Networksort version 1.05. Network for N=4, using Bose-Nelson Algorithm. Input line. Comparator size 1. Comparator size 2. There are 5 comparators in this network, grouped into 3 parallel operations.

[[0,1],[2,3]] [[0,2],[1,3]] [[1,2]]

This is graphed in 4 columns.

伪:

if [0] > [1] {  swap(0, 1)  }
if [2] > [3] {  swap(2, 3)  }
if [0] > [2] {  swap(0, 2)  }
if [1] > [3] {  swap(1, 3)  }
if [1] > [2] {  swap(1, 2)  }

查找索引集

无论如何,这个问题可以通过一种分而治之(伪)来解决:

// First index is unique
if [0] != [1]
    return 0
// First 2 are equal
else if [1] != [2]
    return 0 or 1
// First 3 are equal
else if [2] != [3]
    return 0 or 1 or 2
// All are equal
else
    return 0 or 1 or 2 or 3
end

或者你可以用一个循环来做到这一点:

for i = 0 to 2

    if [i] != [i+1]
       return random(0 to i)
       break loop
    end if

loop

除非速度至关重要,否则您应该选择最具有语义意义且最容易维护的算法。

关于JavaScript 数组 : Algorithm sorting and picking,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5002272/

相关文章:

java - 彼得森锁/解锁java实现

algorithm - 使用 GLSL 组成图 block 的纹理坐标

algorithm - 动态规划是用缓存回溯吗

algorithm - 如何在给定的一段文本中找到匹配的括号或大括号的位置?

javascript - json 值的 jstree 给出了一些错误

javascript - 了解箭头函数参数

javascript - 有没有办法根据其他测试的结果来运行特定的 Protractor 测试?

javascript - 点击展开div不起作用

javascript - 如何使用 javascript 验证文本字段

java - 如何将一个大小为 M 的数组合并到另一个大小为 2M 的数组中