JS算法之数组重组与快速排序

JS的算法题

数组去重

function clearArray(arr){
    new clearArray=new Array;
    for(var i;i<arr.length;i++){
        if(clearArray.indexOf('arr[i]')==-1)//如果没有匹配元素则添加,也可以用来除重
            clearArray.push(arr[i]);
    }
}

利用indexOf匹配进行去重,用indexof来判断数组中是否已有重复元素来添加

快速排序算法

假设有一串数组

41357289
ij

我们取数组的第一个元素为基值(即4),设置2个哨兵(指针)分别指向数组的第一个元素与最后一个元素,

每个哨兵带着基值以此跟数组中相应位置的元素比较(j比i先行),哨兵j先跟9比较,比基值大则j=j-1,直到找到一个小于等于基值的数,此时j暂时停止移动,然后i开始比较,i从左往右进行比较,当遇到一个比基值大的数时候停止移动

41357289
ij

则第一次i,j都停止时,i是在5的位置,j是在2的位置,然后将i,j对应的值互换

41327589
ij

互换值之后j依旧先开始移动,从当前位置接着往下一位比较,重复之前的操作直到i,j相遇

41327589
i,j

当j也移动到2时,i,j相遇,此时停止移动,交换相遇位置的值(即i,j对应的值2)与基值

21347589
i,j

这时我们可以发现,哨兵左边的值都比4要小,右边的值都比4要大,然后以4为分割线,拆分为2个数组

2134
7589

对拆分完后的数组继续进行快序排序,直到序列只有一个的时候。

用JS实现

function quicksort(arr,rear,front){
    var i,j,key;//哨兵,基值
    i=rear;
    j=front;
    key=arr[rear];
    if(rear>=front)
        return 0;
    while(i<j){//i比j要小
        while(arr[j]>key&&i<j){//j先判断
            j--;
        }
        while(arr[i]<=key&&i<j){//j停止后,i开始判断
            i++;
        }
        if(i<j){
            var b;//i,j都停止了
            b=arr[i];
            arr[i]=arr[j];
            arr[j]=b;//交互i,j的值
        }
    }//ij相遇
    arr[rear]=arr[i]//相遇点的值与基值交换
    arr[i]=key;
    quicksort(arr,rear,i-1);//前半部分重复快速排序
    quicksort(arr,i+1,front);//后半部分重复快速排序
}

// var arr = [3,3,-5,6,0,2,-1,-1,3];
// console.log(arr);
// quicksort(arr,0,arr.length-1);
// console.log(arr);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值