js【生成规定数量不重复随机数】、【冒泡排序】、【鸡尾酒排序】、【选择排序】、【插入排序】、【未完工的二分插入排序】------【总结】

【生成规定数量不重复随机数】

 

function creatRandom( num ){


    var randomLen = num,
        ranArr = [],
        thisRan = null,
        whileOff = false,
        cnt = 0;

    //初始化push进去1个
    thisRan = Math.floor( Math.random()*randomLen );
    ranArr.push(thisRan);

    for( var i=1; i<randomLen; i++ ){

        while( true ){
            //在生成1个随机数开始判断之旅
            thisRan = Math.floor( Math.random()*randomLen );


            //whileOff为终止while的开关,只有当thisRan生成了1个与现有数字都不相同的数字时才会关闭while循环
            whileOff = true;
            for( var k=0; k<ranArr.length; k++ ){
                if( thisRan == ranArr[k] ){
                    whileOff = false;
                    break;
                }
            }

            if( whileOff ){ 
                ranArr.push(thisRan);
                break; 
            }
        }
    }

    return ranArr;

}

 

 

 

【冒泡排序】

function bubbling( arr ){
    
    var arr = arr,
        arrLen = arr.length,
        newArr = [],
        broker = null;


    var oldDate = new Date();
    for( var i=0; i<arrLen; i++ ){

        for(var j=0; j<arrLen-1-i; j++){
            if( arr[j] > arr[j+1] ){
                broker = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = broker;
            }

        }



    }
    var newDate = new Date();
    console.log(' ');
    console.log('冒泡排序法'+ arrLen +'个数字花时:'+ (newDate-oldDate) +'毫秒');
    console.log( arr );


}

 

【鸡尾酒排序】

     

function cocktail( arr ) {
    

    var arr = arr,
        arrLen = arr.length,
        newArr = [],
        broker = null;






    var oldDate = new Date();
    for( var i=0; i<arrLen; i++ ){

        for(var j=i; j<arrLen-1-i; j++){
            if( arr[j] > arr[j+1] ){
                broker = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = broker;
            }
            
        }


        for(var k=arrLen-2-i; k>i; k--){
            if( arr[k] < arr[k-1] ){
                broker = arr[k];
                arr[k] = arr[k-1];
                arr[k-1] = broker;
            }

        }


    }
    var newDate = new Date();
    console.log( ' ' );
    console.log('鸡尾酒排序法'+ arrLen +'个数字花时:'+ (newDate-oldDate) +'毫秒');
    console.log( arr );


}

 

【选择排序】

 

function selection( arr ){

var arr = arr,
arrLen = arr.length,
newArr = [],
broker = null;


var cnt = 0,
a = cnt;

var oldDate = new Date();

while( cnt < arrLen ){

for(var i=cnt; i<arrLen; i++){

if( arr[i] < arr[a] ){
a = i;
}
}

broker = arr[cnt];
arr[cnt] = arr[a];
arr[a] = broker;
cnt++;
a = cnt;

}

var newDate = new Date();
console.log( ' ' );
console.log('选择排序法'+ arrLen +'个数字花时:'+ (newDate-oldDate) +'毫秒');
console.log( arr );

 

}

 

【插入排序】

function insertion( arr ){

    var arr = arr,
        arrLen = arr.length,
        newArr = [],
        broker = null;


    var cnt = 0;

    var oldDate = new Date();
    for(var i=0; i<arrLen-1; i++){

        cnt = i;

        var get = arr[cnt+1];
        while( cnt >= 0 && arr[cnt] > get ){
            arr[cnt+1] = arr[cnt];
            cnt--;
        }
        arr[cnt+1] = get;


    }
    var newDate = new Date();
    console.log( ' ' );
    console.log('插入排序法'+ arrLen +'个数字花时:'+ (newDate-oldDate) +'毫秒');
    console.log( arr );


}

 

【未完工的二分插入排序】

//未完工


function binaryInsertion( arr ){

    var arr = arr,
        arrLen = arr.length,
        newArr = [],
        broker = null;



    var oldDate = new Date();
    for(var i=0; i<arrLen-1; i++){

        var cnt = i;
        var get = arr[cnt+1];
        var tIndex = 0;

        if( cnt >= 2000 ){

            console.log( a );

            var j = 1/2;
            var a = Math.floor( (cnt+1)*j );
            var oldA = 0;

            while( true ){

                
                var dif = get - arr[a];
                if( dif == 0 || dif == 1 ){

                    while( get == arr[a] ){
                        a++;
                    }
                    tIndex = a;
                    break;

                }

                if( dif == -1 && a>0 ){
                    a--;
                    tIndex = a;
                    break;
                }




                if( Math.abs( oldA - a ) <= 10 ){
                    var l = oldA<a ? oldA : a;
                    for(var k=l,kLen=Math.abs( oldA - a ); k<kLen-1; k++){
                        if( arr[k] == get ){
                            tIndex = k;
                            break;
                        }
                    }
                }




                //向右
                if( dif > 1 ){
                    oldA = a;
                    j /= 2;
                    a = a + Math.floor( (cnt+1)*j );
                }


                if( dif < -1 ){
                    oldA = a;
                    j /= 2;
                    a = a - Math.floor( (cnt+1)*j );
                }


            }

        }


        while( cnt >= tIndex && arr[cnt] > get ){
            arr[cnt+1] = arr[cnt];
            cnt--;
        }
        arr[cnt+1] = get;


    }
    var newDate = new Date();
    console.log( ' ' );
    console.log('二分插入排序法'+ arrLen +'个数字花时:'+ (newDate-oldDate) +'毫秒');
    console.log( arr );

}

 

 

 

备注:

得益于【http://www.cnblogs.com/eniac12/p/5329396.html#s31】而做的这个js版本,做到二分排序实在做不下去了,主要是不知道怎样验证,其次心力憔悴,先放放,以后学习算法时再回来看看。

 

posted @ 2018-08-22 22:56  蜜蜂老牛黄瓜  阅读(259)  评论(0编辑  收藏  举报