改进排序-希尔排序/堆排序/归并排序/快速排序

一.希尔排序
1.基本思想:
将相距某个“增量”记录组成一个子序列,这样才能保证在子序列内分别进行直接插入排序后得到的结果是基本有序而不是局部有序。

function ShellSort(arr){
    var i,j;
    var increment=arr.length;  //初始化增量为数组长度
    do{
        increment=Math.floor(increment/3)+1;  //取增量
        for(var i=increment+1;i<arr.length;i++){  //将相隔增量的记录作为一个子序列进行排序
            if(arr[i]<arr[i-increment]){  //若增量后面的数小于增量前的数
                var temp=arr[i];  //先将后面数保存
                for(var j=i-increment;j>0&&temp<arr[j];j-=increment) //遍历该数前以增量组成的子序列
                    arr[j+increment]=arr[j];  //把该子序列排序
                arr[j+increment]=temp;  //把temp插入子序列中空出的位置上
            }
        }
    }while(increment>1); //增量变小且大于1
    return arr;
}

2.复杂度分析
将相隔某个增量的继续组成一个子序列,实现跳跃式的移动,使得排序的效率提高。
时间复杂度为:O(n^3/2),它不是一种稳定的算法。

二.快速排序
1.基本思想:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。

function quickSort(arr){
    //如果数组<=1,则直接返回
    if(arr.length<=1){return arr;}
    var pivotIndex=Math.floor(arr.length/2);
    //找基准,并把基准从原数组删除
    var pivot=arr.splice(pivotIndex,1)[0];
    //定义左右数组
    var left=[];
    var right=[];

    //比基准小的放在left,比基准大的放在right
    for(var i=0;i<arr.length;i++){
        if(arr[i]<=pivot){
            left.push(arr[i]);
        }
        else{
            right.push(arr[i]);
        }
    }
    //递归
    return quickSort(left).concat([pivot],quickSort(right));
}

2.复杂度分析
最好情况:O(nlogn);
最坏情况:O(n^2);

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值