JS实现快排、三路快排、随机快排

先看一个问题
设计一个方法,实现小于num的在数组左边,等于num的在中间大于num的在数组右边

function partition(arr,L,R,num) {
    let less=L-1;
    let more=R+1;
    let idx=L;
    for(;idx<more;){
        if (arr[idx]<num){
            swap(arr,++less,idx++);//less先+1再交换,idx先交换再+1
        }
        else  if(arr[idx]>num){
            swap(arr,--more,idx);
        }
        else {
            idx++;
        }
    }
    return arr;
}
function swap(arr,i,j) {
    let temp=arr[i];
  arr[i]=arr[j];
  arr[j]=temp;
}

console.log(partition([5,3,5,1,0,4,1,2,6,8,3], 0, 10,4));

三路随机快排
时间复杂度 长期期望是O(N*logN)空间复杂度O(logN)

//小于等于num的在左边,等于num的在中间,大于num的在右边
function partition(arr,L,R) {
    let less=L-1;
    let more=R+1;
    let idx=L;
    for(;idx<more;){
        if (arr[idx]<arr[R]){
            swap(arr,++less,idx++);//less先+1再交换,idx先交换再+1
        }
        else  if(arr[idx]>arr[R]){
            swap(arr,--more,idx);
        }
        else {
            idx++;
        }
    }
    return [less+1,more-1];// 相同数的最左边和最右边
}
function swap(arr,i,j) {
    let temp=arr[i];
  arr[i]=arr[j];
  arr[j]=temp;
}
function quickSort(arr,L,R){
    if (L<R){
swap(arr,L+Math.floor(Math.random()*(R-L+1)),R);//随机选择一个数字与最后一个数交换作为参照数
        let p=partition(arr,L,R);
        quickSort(arr,L,p[0]-1);
        quickSort(arr,p[1]+1,R);
    }
    return arr;
}

console.log(quickSort([3,5,7,4,2,7,1,4,6,7,0], 0, 4));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值