js实现常用排序(查找)

本文深入解析二分查找、快速排序及二路归并排序等基本算法,探讨其时间复杂度与应用特性,附带JavaScript实现代码,是算法学习者的实用指南。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

各种排序查找的基本算法,持续更新中,分析每个算法时间复杂度。

在这里插入图片描述
二分查找
今天去携程面试,出了个二分查找的算法题,算是压死我的最后一根稻草吧,哎,要认认真真地研究基础知识了。

//二分查找-递归方法
function binarySearch(arr, num, lowIndex, highIndex) {
     var len = arr.length;
     var lowIndex = lowIndex || 0;
     var highIndex = highIndex || len - 1
     var middleIndex = Math.floor((lowIndex + highIndex) / 2)
     if(lowIndex > highIndex) {
          return -1
     }
     if(num === arr[middleIndex]) {
          return middleIndex
     } else if(num > arr[middleIndex]) {
          return binarySearch(arr, num, middleIndex + 1, highIndex)
     } else {
          return binarySearch(arr, num, lowIndex, middleIndex - 1)
     }
     return false
}

var numList = [1,2,3,4,5,6,7,8,9]
console.log(binarySearch(numList, 10))

快速排序
快排效率非常高,也是最常用的排序方法,最坏复杂度为O(n^2), 最好时间复杂度为O(nlogn),平均O(nlogn), 空间复杂度为O(logn),不稳定

function quickSort(arr) {
    if(arr.length <= 1){return arr} 

    var pivotIndex = Math.floor(arr.length / 2)
    var pivot = arr.splice(pivotIndex, 1)[0];
    var left = [];
    var right  = [];
    // arr.
    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))
}

var numList = [29,1,42,22,14,23,52,312,9,111]
console.log(quickSort(numList)) 
运行结果: [ 1, 9, 14, 22, 23, 29, 42, 52, 111, 312 ]

二路归并排序
即把两个有序数组合并成一个有序序列,简称二路归并排序
(注:实现方式有局限性,只适用于左数组从头到中间,右数组从中间到尾的数组)

function merge(left, right) {
    var result = [];
    var leftIndex = 0, rightIndex = 0;
    while(leftIndex < left.length && rightIndex < right.length) {
        if(left[leftIndex] < right[rightIndex]) {
            result.push(left[leftIndex])
            leftIndex ++;
        } else {
            result.push(right[rightIndex])
            rightIndex ++;
        }
    }
    //左边或者右边有多余的项的时候,直接push剩余项
    while(left[leftIndex]) {
        result.push(left[leftIndex])
        leftIndex ++;
    }
    while(right[rightIndex]) {
        result.push(right[rightIndex]);
        rightIndex ++;
    }
    return result
}

function splitArr(arr) {
    var leftArr = [], rightArr = [];
    var pivot;
    for(var i = 0; i < arr.length; i ++) {
        if(arr[i + 1] < arr[i]) {
            pivot = i + 1;
            leftArr = arr.slice(0, pivot)
            rightArr = arr.slice(pivot)
            break;
        } 
    }
    return {
        left: leftArr,
        right: rightArr
    }
}
var arr = [1,2,3,4,1,3,5,7]
var arrObj = splitArr(arr)
console.log(merge(arrObj.left, arrObj.right))
打印结果: [ 1, 1, 2, 3, 3, 4, 5, 7 ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值