频道栏目
首页 > 资讯 > JavaScript > 正文

js实现常见排序方法

17-09-05        来源:[db:作者]  
收藏   我要投稿

js实现常见排序方法

// 交换函数
function swap(arr,i,j) {
    var temp=arr[i];
    arr[i]=arr[j];
    arr[j]=temp;
}

// 冒泡排序
function bubleSort(arr) {
    var flag=true;
    for(var i=0,len=arr.length;ii;j--){
            if(arr[j]temp;j--){
                arr[j+1]=arr[j];
            }
            arr[j+1]=temp;
        }

    }
    return arr;
}
console.log('直接插入排序:',insertSort([8,3,5,1,5,2,1]));

//希尔排序
function shellSort(arr){
    var increment=arr.length;
    do{
        increment=Math.floor(increment/3)+1; // 注意js中的取整运算
        for(var i=increment,len=arr.length;i=0&&temp1);
    return arr;
}
console.log('希尔排序:',shellSort([8,3,5,1,5,2,1]));

//堆排序
function heapSort(arr) {
    for(var i=Math.floor(arr.length/2)-1;i>=0;i--){ // 构建大顶堆
        heapAdjust(arr,i,arr.length-1);
    }

    for(var j=arr.length-1;j>=0;j--){
        //将堆顶元素与最后一个元素交换
        var temp=arr[0];
        arr[0]=arr[j];
        arr[j]=temp;
        //调整前j-1个元素组成的堆
        heapAdjust(arr,0,j-1);
    }
    return arr;
}

function heapAdjust(arr,s,m) { // s是要调整元素的下标,m是堆中最后一个元素的下标
    var temp,j;
    temp=arr[s];
    for(j=2*s+1;j<=m;j=2*j+1){
        if(j<>=arr[j]) // 如果arr[s]比其左右子节点都大,则跳出循环,此结点调整完毕
            break;
        arr[s]=arr[j]; // 否则当前结点的值被较大子节点代替
        s=j;    // 并将当前结点(接下来要调整的结点)设为较大子节点
    }
    arr[s]=temp;
}
console.log('堆排序:',heapSort([8,3,5,1,5,2,1]));
console.log('堆排序:',heapSort([1,2]));

//归并排序
function mergeSort(arr) {
    if(arr.length===0){return [];}
    Msort(arr,arr,0,arr.length-1);
    return arr;
}

function Msort(arr,res,s,t) {
    var m;
    var TR2=[];
    if(s===t){
        res[s]=arr[s];
    }else{
        m=Math.floor((s+t)/2);
        Msort(arr,TR2,s,m);
        Msort(arr,TR2,m+1,t);
        Merge(TR2,res,s,m,t);
    }
}
// 将有序的SL[i...m]和SL[m+1...n]合并为有序的res[i...n]
function Merge(SL,res,i,m,n) {
    var j,k,p;
    for(k=i,j=m+1;i<=m&&j<=n;k++){ //从头开始遍历两个有序数组,直到有一个遍历到最后
        if(SL[i]arr[high])
        swap(arr,low,high);
    if(arr[m]>arr[high])
        swap(arr,m,high);
    if(arr[m]>arr[low])
        swap(arr,m,low);
    var pivotkey=arr[low];// 此时low已经是三者中的中间值

    var temp=pivotkey;// 替换的方法,而非交换的方法
    while (low=pivotkey){high--;}

        //swap(arr,high,low); // 交换的方法
        arr[low]=arr[high]; //采用替换的方法

        while (low
相关TAG标签
上一篇:JavaScript数组去重
下一篇:HDFS源码分析数据块校验之DataBlockScanner
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站