日期:2014-05-16  浏览次数:20414 次

求更有效率的代码 JS 数组 随机自动排序
网上查到一个方法(这个方法效率不高,不贴出代码了):

  基本思路:随机读取数组1中的一个数据,将其与数组2中的数据进行比较,如果存在,就另读取,直到读到新数据存到数组2中,当数组2的长度等于数组1的长度时,停止读取数据,输出数组2。
  变化:因为数据有可能有重复,所以再使用一个数据来存储数组2中的数据序号,检验数据是否读取过时,改成比较数据序号。

于是按自己想法写了,加上多次改进(勉强达要求):
JScript code

function ran_Arr_2(oArr) {
    var arrNum = [];
    var tArr = [];//新数组
    var random_x;
    for(var i=oArr.length;i>0;i--) {
        random_x = Math.floor(Math.random()*i); //   取得一个随机数
        arrNum.push(random_x);//压进位置
        for(var j=0;j<arrNum.length-1;j++) {
            if( random_x >= arrNum[j])
                random_x++;
        }
        tArr.push(oArr[random_x]); //压进数组
    }
    return tArr; //返回新数组
}

function ran_Arr_3(oArr) {
    var oArr_copy = oArr.slice(0);//复制原数组
    var tArr = [];//新数组
    var random_x;
    for(var i=oArr.length;i>0;i--) {
        random_x = Math.floor(Math.random()*i); //   取得一个随机数
        tArr.push(oArr_copy[random_x]); //压进数组
        oArr_copy[random_x] = oArr_copy[i-1];
    }
    return tArr; //返回新数组
}

function ran_Arr_4(oArr) {
    var temp_x; //临时交换数
    var tArr = oArr.slice(0);//新数组,复制原数组
    var random_x;
    for(var i=oArr.length;i>0;i--) {
        random_x = Math.floor(Math.random()*i); //   取得一个随机数
        temp_x = tArr[random_x];
        tArr[random_x] = tArr[i-1];
        tArr[i-1] = temp_x;
    }
    return tArr; //返回新数组
}





现求更有效率的代码:

------解决方案--------------------
看不明白
“ 基本思路:随机读取数组1中的一个数据,将其与数组2中的数据进行比较,如果存在,就另读取,直到读到新数据存到数组2中,当数组2的长度等于数组1的长度时,停止读取数据,输出数组2。 ”

数组1和2没有限定条件?比如长度?如果2大于永远也不会有结果................
------解决方案--------------------
帮顶
------解决方案--------------------
JScript code

var a = [1, 2, 3, 4, 5, 6,7];
    var b = [2, 6,10];
   
    var isok = true;
  
    while (true) {
        isok = true;
        var lena = a.length;
        var lenb = b.length;
        if (lenb >= lena) {
            break;
        }
        var rand = Math.round(Math.random() * (lena-1));
    
        for (var i = 0; i < lenb; i++) {
            if (b[i] == a[rand]) {
                isok = false;
                break;
            }
        }
        if (isok == true) {
            b.push(a[rand]);
        }
    
    }
    document.getElementById("div1").innerHTML =b.valueOf();

------解决方案--------------------
路过
------解决方案--------------------
基本思路:随机读取数组1中的一个数据,将其与数组2中的数据进行比较,如果存在,就另读取,直到读到新数据存到数组2中,当数组2的长度等于数组1的长度时,停止读取数据,输出数组2。

给我的感觉你的意思就是比较两个数组arr1,arr2,如果arr2中没有arr1的数据,就是当前arr1的数据写入arr2中,并且arr2的长度不能大于arr1的长度,并没有存在排序的问题?!
JScript code

         var arr1 = [1,2,3,5,6,8,9];
         var arr2 = [4,6];
         function addSome(arr1,arr2){
             if(arr1==null||arr1.length==0) return [];
             if(arr2==null||arr2.length==0) return arr1;
             var length = arr2.length;
             var obj = new Object();
             for(var i=0; i<length; i++){
                 eval("obj.pop" + arr2[i] + "='" + arr2[i] + "';");
             }
             var l = arr1.length;
             for(var i=0;i<l;i++) {
                 if(eval("typeof obj.pop" + arr1[i] + "=='undefined'")){
                    arr2.push(arr1[i]);
                 }
                 if(arr2.length==l){
                     break;
                 }
             }
             return arr2.sort(); //如果要排序的话,再加上sort
         }
         var t = addSome(arr1,arr2);
         alert(t);

------解决方案--------------------