美文网首页我爱编程
js归并排序-快速排序-堆排序

js归并排序-快速排序-堆排序

作者: 牛奶大泡芙 | 来源:发表于2018-04-13 17:02 被阅读0次

    前端面试经常遇到一个问题:有两个无序数组,用一个方法把他们合并且排序,嗯嗯,那么就concat然后归并吧

     function merge(left, right){
            let tmp = [];
            while(left.length && right.length){
                if(Number.parseInt(left[0])<Number.parseInt(right[0])){
                    tmp.push(left.shift());
                }else{
                    tmp.push(right.shift());
                }
                console.log(tmp.join(',')+'...'+left.join(',')+'...'+right.join(','));
            }
            return tmp.concat(left,right);
        }
    function mergesort(arr){
            console.log('mergesort--'+arr);
            if(arr.length==1){
                return arr;
            }else{
                let mid = Math.floor(arr.length/2);
                let left = arr.slice(0, mid);
                let right = arr.slice(mid);
                console.log('hihi'+left.join(',')+'--'+right.join(','));
                return merge(mergesort(left),mergesort(right));
            }
        };
    function star(){
                var arr1 = document.getElementsByTagName('input')[0].value.split(',');
            var arr2 = document.getElementsByTagName('input')[1].value.split(',');
            var ele = document.getElementsByTagName('span')[0];
                console.log('start'+arr1+arr2);
            ele.innerHTML = mergesort(arr1.concat(arr2)).toString();
        }
    

    能不用冒泡和插入排序尽量就不用了,因为复杂度都是n方,归并和快速都是nlogn,相对好一些
    下面任然介绍一下快排:

    function quicksort(arr){
            if(arr.length<=1) return arr;
            let judge = 0,left = [], right = [];
            judge = arr[Math.floor(arr.length/2)];
            arr.splice(Math.floor(arr.length/2),1);
            for(let i = 0; i<arr.length; i++){
                console.log(typeof arr[i]);
                if(arr[i]<judge){
                    left.push(arr[i]);
                }else{
                    right.push(arr[i]);
                }
                console.log(left.concat([judge],right).toString());
            }
            return quicksort(left).concat([judge],quicksort(right));
        };
     function star(){
                var arr1 = document.getElementsByTagName('input')[0].value.split(',');
            var arr2 = document.getElementsByTagName('input')[1].value.split(',');
            arr1 = arr1.map(x=>+x);
            arr2 = arr2.map(x=>+x);
            var ele = document.getElementsByTagName('span')[0];
                console.log('start'+arr1+arr2);
            ele.innerHTML = quicksort(arr1.concat(arr2)).toString();
        }
    

    提示:如果快速排序不把judge标志元素从数组中splice掉,会导致栈溢出
    最后是堆排序,利用大顶堆进行1)构造堆 2)调整堆

    function heap(arr, large, len) {
        var origin = large;
        var left = large*2 + 1;
        var right = left + 1;
        var temp = null;
        if(left<len && arr[large]<arr[left]){
            large = left;
        }
        if(right<len && arr[large]<arr[right]){
            large = right;
        }
        if(large !== origin) {
            temp = arr[origin];
            arr[origin] = arr[large];
            arr[large] = temp;
            arguments.callee(arr, large, len);
        }
        return arr;
    }
    function sort(arr) {
        var len = arr.length;
        var temp = null;
        var res = [];
        //init
        for(let i = Math.floor(len/2); i>=0;i--) {
            heap(arr, i, len);
    console.log(arr,'666')
        }
        for(let i = len-1;i>0;i--) {
            res.push(arr);
            temp = arr[0];
            arr[0] = arr[i];
            arr[i] = temp;
            heap(arr, 0, i);
        }
        return arr;
    }
    sort([0,4,5,6,2,21,3,5,9])
    

    相关文章

      网友评论

        本文标题:js归并排序-快速排序-堆排序

        本文链接:https://www.haomeiwen.com/subject/egthkftx.html