前端算法天天练

1.二分查找 (2022-08-09)

/**
 * 
 * @param {*} arr 有序数组
 * @param {*} x 要查找的值
 * @returns 如果找到返回该元素在数组中的位置,如果没有找到返回-1
 * 循环不变量
 */
function binarySearch(arr, x) {
    // l 左数据 r 右数据 g 位置
    let l = 0, r = arr.length - 1, g = 0;
    while (l <= r) {
        g = Math.floor((l + r) / 2);
        if (arr[g] === x) { return g }
        else if (arr[g] > x) { r = g - 1 }
        else { l = g + 1 }
    }
    return -1
}

const arr = [2, 4, 5, 6, 7, 9, 13];
console.log(binarySearch(arr, 9)) // 5
console.log(binarySearch(arr, 8)) // -1
console.log(binarySearch(arr, 13)) // 6

2.插入排序(2022-08-10)

/**
 * 
 * @param {*} A 有序数组
 * @param {*} x 将要插入到数组中的元素
 */
function base_insert(A, x) {
    let p = A.length - 1
    while (p > 0 && A[p] > x) {
        A[p + 1] = A[p]
        p--
    }
    A[p + 1] = x
}
/**
 * 基于将一个元素插入到一个有序的数组中进行改进
 * @param {*} A 传入的待排序的数组
 * @param {*} i 数组中的下表
 * @param {*} x 数组中下表对应的值
 */
function base_insert(A, i, x) {
    let p = i - 1
    while (p > 0 && A[p] > x) {
        A[p + 1] = A[p]
        p--
    }
    A[p + 1] = x
}

/**
 * 
 * @param {*} arr 传入待排序数组
 */
function insert_sort(arr) {
    for (let i = 1; i < arr.length; i++) {
        base_insert(arr, i, arr[i])
    }
}

const arr = [2, 3, 14, 6, 7, 9, 13]
insert_sort(arr)
console.log(arr) // [ 2, 3, 6, 7, 9, 13, 14 ]

3.冒泡排序(2022-08-11)

/**
 * 冒泡排序
 * 外层循环控制气泡的冒出
 * 内层循环进行比较大小并且控制位移
 * i=1 
 *      j=1 A=[5,8,1,3,2,4,6]
 *      j=2 A=[5,1,8,3,2,4,6]
 *      j=3 A=[5,1,3,8,2,4,6]
 *      j=4 A=[5,1,3,2,8,4,6]
 *      j=5 A=[5,1,3,2,4,8,6]
 *      j=6 A=[5,1,3,2,4,6,8]
 * i=2 
 * i=3
 * i=4
 * i=5
 * i=6
 */
function bubble_sort() {
    for (let i = A.length - 1; i >= 1; i--) {
        for (let j = 1; j <= i; j++) {
            A[j - 1] > A[j] && swap(A, j - 1, j)
        }
    }
}
/**
 * 交换数组中两个元素的位置
 * @param {*} A 传入的数组
 * @param {*} i 
 * @param {*} j 
 */
function swap(A, i, j) {
    const temp = A[i]
    A[i] = A[j]
    A[j] = temp
}

const A = [5,8,1,3,2,4,6]
bubble_sort(A)
console.log(A) // [ 1, 2, 3, 4, 5, 6, 8 ]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值