算法-JavaScript(1)

二分法查找

在这里插入图片描述
二分法查找:g为猜测位置,l为左边界,r为右边界,

function bsearch(A, x) {
    let l = 0, //查询范围的左边界
    r = A.length-1, //查找范围的右边界
    guess //猜测位置
    while (l <= r){
        guess = Math.floor((l+r)/2)
        //循环不变式
        //guess等于l,r中间位置
        //l:查找范围左,r:查找范围右
        if(A[guess]===x) return guess
        else if(A[guess]>x) r = guess -1
        else  l = guess +1
        //循环不变式
        //l:新查找范围左,r:新查找范围右
    }
    return -1
}

const A =[3,5,6,7,9,22,25,44,65,78,98,99];
console.log(bsearch(A, 88))
console.log(bsearch(A,68))
console.log(bsearch(A,98))

结果:

-1
-1
10
插入排序

JavaScript原始实现

const A = [2,4,7,9,13]
const x = 8
const b = A.find(a => a > x)
const index = A.indexOf(b)
A.splice(index ===-1?A.length:index, 0, x)
function insert(A, i, x) {
    //p指向下一个需要比较的元素
    //p+1 指向空位

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

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

const C = [5,8,1,3,9,12,18,32]
insertion_sort(C)
console.log(C)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
梁友栋-Barsky算法是一种用于线段裁剪的算法,它可以快速计算出线段与裁剪窗口的交点,并将线段裁剪为裁剪窗口内的部分。以下是一个使用JavaScript实现梁友栋-Barsky算法的示例代码: ```javascript function cohenSutherland(x1, y1, x2, y2, xmin, ymin, xmax, ymax) { var INSIDE = 0; // 0000 var LEFT = 1; // 0001 var RIGHT = 2; // 0010 var BOTTOM = 4; // 0100 var TOP = 8; // 1000 function computeOutCode(x, y) { var code = INSIDE; if (x < xmin) { code |= LEFT; } else if (x > xmax) { code |= RIGHT; } if (y < ymin) { code |= BOTTOM; } else if (y > ymax) { code |= TOP; } return code; } var outcode1 = computeOutCode(x1, y1); var outcode2 = computeOutCode(x2, y2); var accept = false; while (true) { if ((outcode1 | outcode2) === 0) { // 全部在裁剪窗口内 accept = true; break; } else if ((outcode1 & outcode2) !== 0) { // 全部在裁剪窗口外 break; } else { var x, y; var outcodeOut = outcode1 !== 0 ? outcode1 : outcode2; if ((outcodeOut & TOP) !== 0) { x = x1 + (x2 - x1) * (ymax - y1) / (y2 - y1); y = ymax; } else if ((outcodeOut & BOTTOM) !== 0) { x = x1 + (x2 - x1) * (ymin - y1) / (y2 - y1); y = ymin; } else if ((outcodeOut & RIGHT) !== 0) { y = y1 + (y2 - y1) * (xmax - x1) / (x2 - x1); x = xmax; } else if ((outcodeOut & LEFT) !== 0) { y = y1 + (y2 - y1) * (xmin - x1) / (x2 - x1); x = xmin; } if (outcodeOut === outcode1) { x1 = x; y1 = y; outcode1 = computeOutCode(x1, y1); } else { x2 = x; y2 = y; outcode2 = computeOutCode(x2, y2); } } } if (accept) { // 在这里绘制裁剪后的线段 console.log("裁剪后的线段:(" + x1 + ", " + y1 + "), (" + x2 + ", " + y2 + ")"); } else { console.log("线段在裁剪窗口外,无法裁剪"); } } // 示例使用 cohenSutherland(50, 50, 200, 200, 100, 100, 300, 300); ``` 这段代码实现了梁友栋-Barsky算法的主要逻辑,通过传入线段的起点和终点坐标以及裁剪窗口的边界坐标,可以计算出裁剪后的线段。在示例中,我们裁剪了一个起点为(50, 50),终点为(200, 200)的线段,裁剪窗口的边界为(100, 100, 300, 300)。你可以根据自己的需求修改这些参数来进行测试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值