二分查找排序js

二分查找(Binary Search)是一种 查找算法,用于在已排序的数组中快速找到目标值。它通过将数组分成两半来缩小搜索范围,从而减少了查找的时间复杂度。二分查找的时间复杂度是 O(log n),非常高效。

二分查找与排序

二分查找本身不是排序算法。它是在已排序的数组中查找一个特定元素。排序算法通常用于将一个无序的数组排列成有序的数组,而二分查找则依赖于数组已经是有序的。

不过,如果你是想问如何使用 二分查找来插入元素并保持数组的有序性,那就是 二分插入排序(Binary Insertion Sort)

二分插入排序(Binary Insertion Sort)

二分插入排序是插入排序的一种优化方式。在传统的插入排序中,插入元素时我们会通过线性查找找到插入位置。而在二分插入排序中,我们使用二分查找来加速查找插入位置,从而减少比较次数,尽管时间复杂度仍然是 O(n^2),但是它会更高效地找到插入点。

二分插入排序算法步骤
  1. 从第二个元素开始,假设第一个元素已经排序。
  2. 对于每个待插入的元素,使用二分查找来找到它应该插入的位置。
  3. 将比当前元素大的所有元素向右移动一位。
  4. 插入当前元素到正确的位置。
function binaryInsertionSort(arr) {
    // 遍历数组,从第二个元素开始
    for (let i = 1; i < arr.length; i++) {
        let current = arr[i];  // 当前待插入元素
        let left = 0;
        let right = i - 1;

        // 使用二分查找找到插入位置
        while (left <= right) {
            let mid = Math.floor((left + right) / 2);
            if (arr[mid] > current) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }

        // 将大于当前元素的所有元素右移
        for (let j = i - 1; j >= left; j--) {
            arr[j + 1] = arr[j];
        }

        // 插入当前元素到正确的位置
        arr[left] = current;
    }
    return arr;
}

// 测试
let arr = [5, 2, 9, 1, 5, 6];
console.log(binaryInsertionSort(arr));  // 输出: [1, 2, 5, 5, 6, 9]

 

  1. 二分查找:在每一轮插入中,我们用二分查找来寻找合适的位置。这通过将待插入元素与数组的中间元素比较,然后根据比较结果决定查找的范围(左半边还是右半边)。通过这种方法,查找插入位置的时间复杂度从 O(n) 降低到了 O(log n)。

  2. 移动元素:找到插入位置后,我们将数组中大于当前元素的所有元素右移一位,为当前元素腾出空间。

  3. 插入元素:将当前元素插入到合适的位置。

二分插入排序与普通插入排序的对比

  • 时间复杂度
    • 普通插入排序的时间复杂度是 O(n^2),因为它需要通过线性查找来找到插入位置。
    • 二分插入排序的查找步骤时间复杂度是 O(log n),但依然需要 O(n) 的时间来移动元素,因此总体时间复杂度仍然是 O(n^2),不过在查找位置时更加高效。
  • 空间复杂度:O(1),这两者都是原地排序算法,不需要额外的空间。

总结

  • 二分查找 本身不是一个排序算法,它是一个用于查找元素的算法,适用于已排序的数组。
  • 二分插入排序 是一种优化过的插入排序,利用二分查找来减少元素插入时的位置查找时间,但由于需要移动元素,其时间复杂度仍然是 O(n^2)。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿征学IT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值