Javascript数组:算法排序和拾取
在本例中,我有一个由4个介于0和256之间的整数组成的数组,需要按升序排序。例如: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)中选择一个随机索引,其他可能性是(排序后): 因此,我需要从升序排序数组中最顶端的值中选择一个随机索引。
[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);
}