Javascript数组:算法排序和拾取

Javascript数组:算法排序和拾取,javascript,algorithm,Javascript,Algorithm,在本例中,我有一个由4个介于0和256之间的整数组成的数组,需要按升序排序。例如: [0,12,211,4]当我对我得到的数据进行排序时(当然):[0,4,12,211] 我只是通过请求数组[0]来获取整数值(第一个索引) 现在,我的问题是;很多时候,数组中存在相等的值。比如: [0, 0, 0, 12] // already sorted 在这些情况下,我需要从最上面的相等值(0,0,0)中选择一个随机索引,其他可能性是(排序后): 因此,我需要从升序排序数组中最顶端的值中选择一个随机索引。

在本例中,我有一个由4个介于0和256之间的整数组成的数组,需要按升序排序。例如:

[0,12,211,4]
当我对我得到的数据进行排序时(当然):
[0,4,12,211]

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

现在,我的问题是;很多时候,数组中存在相等的值。比如:

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

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

从右到左进行for循环以选择元素将起作用,如果在排序过程之后完成,则只会增加N的复杂性

nlogn
更改为
nlogn+n
并不需要太多cpu开销

编辑: 在您的示例中,最重要的值不应该是:

[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 1 or 2 
[0, 1, 1, 4] // results in 1 or 2;

??排序

如果速度很重要(你似乎认为这很重要),那么你有没有研究过分拣网络?我发现在对一小部分数字进行排序时,它们的速度非常快

要使用排序网络进行排序,请执行以下操作:

N=4的网络,使用Bose Nelson 算法

创作日期:星期二2011年2月15日04:44:06 创建者:perl模块 算法::Networksort版本1.05。 N=4的网络,使用Bose Nelson 算法。输入行。比较器尺寸 1.比较器尺寸2。该网络中有5个比较器,分组 分为3个并行操作

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

这是在4列中绘制的

伪:

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)  }
查找索引集

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

或者,您可以通过循环执行此操作:

for i = 0 to 2

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

loop

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

这将返回一个随机的等值索引:

var myNums = new Array(211, 211, 211,211,214, 255);
myNums = myNums.sort();
if(myNums.length == 0)
    alert("Array is zero sized");
else
{
   var smallest = myNums[0];
   var last=0;
   var start = 0;
   while(smallest == myNums[last])
       last++;
   last = last-1;
   var randIndex = Math.floor(Math.random() *(last - start + 1)+ start);
   alert(randIndex);
}
请在此处查看它的工作情况:

在这种情况下,最上面的优先,如果有任何相等,这是第二条规则,因此我的示例是正确的;)请您澄清一下您想要什么。从数组中最上面的值中选择一个随机索引?????是不是当最低值重复多次时,您需要返回此元素出现的所有索引。
for i = 0 to 2

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

loop
var myNums = new Array(211, 211, 211,211,214, 255);
myNums = myNums.sort();
if(myNums.length == 0)
    alert("Array is zero sized");
else
{
   var smallest = myNums[0];
   var last=0;
   var start = 0;
   while(smallest == myNums[last])
       last++;
   last = last-1;
   var randIndex = Math.floor(Math.random() *(last - start + 1)+ start);
   alert(randIndex);
}