基本排序算法js

1.希尔排序 时间复杂度 O(nlog2 n)到O(n^2)
是插入排序的一种又称“缩小增量排序”,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。

function sellSort(arr,index){
    if(!index){index=1;}
    var len = arr.length;
    if(len<=1) return arr;
    var key = parseInt(len/(2*index)),i=0;
    if(key<1) return arr;
    console.log(key)
    while(arr[i]&&arr[i+key]){
        if(arr[i]>arr[i+key]){
            [arr[i],arr[i+key]] = [arr[i+key],arr[i]];
        }
        i++;
    }
    index++;
    arr = sort(arr,index);
    return arr; 
}

2.直接插入排序 O(n^2)
每一趟将一个待排序的记录,按其关键字的大小插入到已经排好序的一组记录的适当位置上,直到所有待排序记录全部插入为止。

function detectSort(arr){
    if(arr.length<=1) return arr;
    var i =1;
    for(;i<arr.length;i++){
    var key=i; console.log('s'+key)
    while(arr[key]&&arr[key-1]){
        if(arr[key-1]>arr[key]){
            [arr[key],arr[key-1]] = [arr[key-1],arr[key]];
        }
         console.log(arr)
        key--;
    }
    }
    return arr;
}

3.快速排序 O(nlog2 n) 最坏O(n^2)
基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

function sort(arr){
    if(arr.length<=1) return arr;
  var left = [],right=[],key=0,mids=[];
    for(let item of arr){
        if(arr[0]>item){
            left.push(item)
        }else if(arr[0]<item){
            right.push(item)
        }else{
            mids.push(item)
        }
    }
    var _left = sort(left), _right=sort(right); 
    return _left.concat(mids,_right)
}

一条表达式:

function quickSort(arr){
    return arr.length<=1? arr:quickSort(arr.slice(1).filter( a=> a<arr[0])).concat(arr.filter( a=> a==arr[0]),quickSort(arr.slice(1).filter( a=> a>arr[0])))
}

归并排序 时间复杂度 O(n log n) 空间复杂度 O(n)
基本思想是:建立在归并操作上的一种有效的排序算法,该算法是采用分治法

function sort(arr){
    if(arr.length<=1) return arr;
    var left = [], right=[] ,key =arr.length/2;
    if(key==1){}
    arr.forEach(function(item,i){
        if(key>i){
            left.push(item)
        }else{
            right.push(item)
        }
    })
    return merge(sort(left),sort(right));
}
function merge(left,right){
    var arr=[];


    while(left.length>0&&right.length>0){
        var x=left.shift(),y=right.shift();
        if(x>y){
            arr.push(y);left.unshift(x);
        }else{
            arr.push(x); right.unshift(y);
        }
    }


    return arr.concat((left),(right))
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值