算法

91 阅读1分钟

1、二分法

function bsearch(arr, target) {
    let l = 0,    // 查询范围左边界
        r = arr.length - 1,    // 查询范围有边界
        g    // 猜测位置
    while(l <= r) {
        g = Math.floor((l + r) / 2)
        if (arr[g] === target) return g
        else if (arr[g] < target) {
            r = g - 1
        } else {
            l = g + 1
        }
    }
    return -1
}

2、插入排序

function insert(A, i , x) {
    let p = i - 1
    while ( p > 0 && A[p] > x) {
        A[p + 1] = A[p]
        p--
    }
    A[p + 1] = x
}

function insert_sort(A) {
    for(let i = 1 ; i < A.length ; i++) {
        insert(A, i , A[i])
    }
}

3、冒泡排序

function bubble_sort(A) {
    for (let i = A.length - 1 ; i >= 1 ; i--) {    // i 指向最大值-》倒数第二大的值
        for (let j = 1 ; j <= i ; j++) {
                if(A[j - 1] > A[j]) {
                    let temp = A[j]
                    A[j] = A[j - 1]
                    A[j - 1] = temp
                }
        }
    }
}

4、合并排序

// A 数组
// p 排序开始位置
// q 排序取的中间位置
// r 排序最右边位置
function merge(A, p, q, r) {
    let A1 = A.slice(p, q)    // 左边的数组
    let A2 = A.slice(q, r)    // 右边的数组
    A1.push(Number.MAX_SAFE_INTEGER)
    A2.push(Number.MAX_SAFE_INTEGER)
    for(let k = p, i = 0, j = 0 ; k < r ; k++) {
        // 两个数组对比大小,选取小的占k的位置
        A[k] = A1[i] < A2[j] ? A1[i++] : A2[j++] 
    }
}

// A 数组
// p 排序开始位置
// q 排序结束位置
function merge_sort(A, p, r) {
    if ((r - q) < 2) return
    let q = Math.ceil((r - q) / 2)
    merge_sort(A, p, q)    // 递归将左边数组拆分
    merge_sort(A, q, r)    // 递归将右边数组拆分
    merge(A, p , q, r)     // 合并拆分的数组
}