荷兰国旗、经典快排、随机快排

荷兰国旗

荷兰国旗问题,例如一个数组[1,4,3,5,6,7,2],给定一个num=2,把小于num的放左边,等于num的放中间,大于num的放右边。

function partition(arr, num) {
    let cur = 0,
        left = -1,
        right = arr.length
    while (cur < right) {
        if (arr[cur] < num) {
            //小于num 把这个数跟小于区域的下一个数交换 小于区域向右扩大一位 cur向右挪一位
            swap(arr, ++left, cur++)
        } else if (arr[cur] > num) {
            //大于num 把这个数跟大于区域的前一个数交换 cur不动 继续考察换过来的这一个数 大于区域向左扩大一位
            swap(arr, --right, cur)
        } else {
            cur++
        }
    }
}

function swap(arr, i, j) {
    let temp = arr[i]
    arr[i] = arr[j]
    arr[j] = temp
}

经典快排

相当于把数组的最后一个数当做num,递归partition操作。

function quickSort(arr, L, R) {
    if (L < R) {
        let a = partition(arr, L, R)
        quickSort(arr, L, a[0] + 1)
        quickSort(arr, a[1], R)
    }
}

function partition(arr, L, R) {
    let cur = L,
        left = L - 1,
        right = R,
        target = arr[right - 1]
    while (cur < right) {
        if (arr[cur] < target) {
            //小于num 把这个数跟小于区域的下一个数交换 小于区域向右扩大一位 cur向右挪一位
            swap(arr, ++left, cur++)
        } else if (arr[cur] > target) {
            //大于num 把这个数跟大于区域的前一个数交换 cur不动 继续考察换过来的这一个数 大于区域向左扩大一位
            swap(arr, --right, cur)
        } else {
            cur++
        }
    }
    return [left, right]
}

function swap(arr, i, j) {
    let temp = arr[i]
    arr[i] = arr[j]
    arr[j] = temp
}
let arr = [7, 2, 1, 4, 3, 5, 6]
quickSort(arr, 0, arr.length)
console.log(arr)

随机快排

先随机选一个数与最后一个数交换,再来做划分
只需在partition之前加上一句

swap(arr, L + Math.floor(Math.random() * (R - L)), R - 1)    
全部评论

相关推荐

07-15 14:14
门头沟学院 Java
7.10投递7.15感谢信
投递地平线等公司7个岗位
点赞 评论 收藏
分享
苍蓝星上艾露:这简历。。。可以试试我写的开源简历优化工具https://github.com/weicanie/prisma-ai
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-16 18:03
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务