📜  算法|插入排序|问题5(1)

📅  最后修改于: 2023-12-03 15:27:25.990000             🧑  作者: Mango

算法 | 插入排序 | 问题5

简介

在计算机科学中,插入排序是一种简单直观的排序算法。插入排序的工作方式类似于整理一手扑克牌,始终保持手上的牌是有序的。当我们需要把新的一张牌加入到这堆牌中时,我们会从右至左开始比较,直到找到新牌应该插入的位置。然后再把在这个位置及以后的牌整体往右移一位,以便腾出位置为新牌让路。

在本文中,我们将介绍如何使用JavaScript编写插入排序算法,并且会针对问题5做一些讨论。

插入排序代码

以下是使用JavaScript编写的插入排序代码:

function insertionSort(arr) {
  for (let i = 1; i < arr.length; i++) {
    let j = i - 1;
    let temp = arr[i];
    while (j >= 0 && arr[j] > temp) {
      arr[j + 1] = arr[j];
      j--;
    }
    arr[j + 1] = temp;
  }
  return arr;
}
问题5

问题5是一个比较经典的插入排序问题,大致是这样的:给定一个已排序(升序)的数组和一个目标值,请你在数组中找到这个目标值,并返回其下标。如果目标值不存在于数组中,则返回它应该被插入的位置的下标,也就是说插入后数组仍然保持有序(升序)。

解法:我们可以使用二分查找来解决问题5。在每一次循环中,我们都会把数组分成两部分,左边是比目标值小的元素,右边是比目标值大的元素,然后分别去查找。如果目标值不在数组中,我们最终会找到应该插入的位置,这个位置就是左边数组的长度。

以下是使用二分查找解决问题5的代码:

function searchInsert(nums, target) {
  let left = 0;
  let right = nums.length - 1;
  while (left <= right) {
    const mid = Math.floor((left + right) / 2);
    if (nums[mid] === target) {
      return mid;
    } else if (nums[mid] > target) {
      right = mid - 1;
    } else {
      left = mid + 1;
    }
  }
  return left;
}
总结

插入排序是一种简单而又直观的排序算法,虽然它的时间复杂度比较高,但是对于小规模的数据集,插入排序的效率并不会比其他复杂度更低的排序算法差。通过本文的介绍,我们不仅学到了插入排序的实现方式,也学到了如何使用二分查找来解决问题5。