侧边栏壁纸
  • 累计撰写 225 篇文章
  • 累计创建 275 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

介绍8个入门级别的基础算法

DGF
DGF
2023-05-13 / 0 评论 / 0 点赞 / 10 阅读 / 0 字

线性搜索

顺序搜索或线性搜索是最简单的搜索算法,它从列表或数组的开头开始逐个比较元素,直到找到目标值或搜索完整个列表。

function linearSearch(array, target) {
  for (let i = 0; i < array.length; i++) {
    if (array[i] === target) {
      return i; // 返回目标值在数组中的索引
    }
  }
  return -1; // 目标值不存在于数组中
}

// 示例用法
const arr = [5, 2, 4, 7, 1, 9, 3];
const target = 7;
const result = linearSearch(arr, target);
if (result !== -1) {
  console.log("目标值 " + target + " 的索引为 " + result);
} else {
  console.log("目标值 " + target + " 不存在于数组中");
}

二分搜索

二分搜索是一种高效的搜索算法,适用于已排序的数组。它通过将目标值与数组的中间元素进行比较,然后根据比较结果在数组的前半部分或后半部分继续搜索,直到找到目标值或搜索范围缩小为空。

function binarySearch(array, target) {
  let left = 0;
  let right = array.length - 1;

  while (left <= right) {
    let mid = Math.floor((left + right) / 2);

    if (array[mid] === target) {
      return mid; // 返回目标值在数组中的索引
    } else if (array[mid] < target) {
      left = mid + 1; // 目标值在右半部分
    } else {
      right = mid - 1; // 目标值在左半部分
    }
  }

  return -1; // 目标值不存在于数组中
}

// 示例用法
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
const target = 6;
const result = binarySearch(arr, target);
if (result !== -1) {
  console.log("目标值 " + target + " 的索引为 " + result);
} else {
  console.log("目标值 " + target + " 不存在于数组中");
}

冒泡排序

冒泡排序是一种简单的排序算法,它通过重复地交换相邻的元素,将较大(或较小)的元素逐渐移动到数组的一端,直到整个数组排序完成。

function bubbleSort(array) {
  const length = array.length;

  for (let i = 0; i < length - 1; i++) {
    for (let j = 0; j < length - 1 - i; j++) {
      if (array[j] > array[j + 1]) {
        // 交换相邻的两个元素
        const temp = array[j];
        array[j] = array[j + 1];
        array[j + 1] = temp;
      }
    }
  }

  return array;
}

// 示例用法
const arr = [5, 2, 4, 7, 1, 9, 3];
const sortedArr = bubbleSort(arr);
console.log("排序后的数组:", sortedArr);

选择排序

选择排序也是一种简单的排序算法,它通过每次从未排序的部分选择最小(或最大)的元素,并将其放置在已排序部分的末尾,逐渐完成整个数组的排序。

function selectionSort(array) {
  const length = array.length;

  for (let i = 0; i < length - 1; i++) {
    let minIndex = i;

    // 在未排序部分中找到最小的元素索引
    for (let j = i + 1; j < length; j++) {
      if (array[j] < array[minIndex]) {
        minIndex = j;
      }
    }

    // 将最小的元素与当前位置交换
    if (minIndex !== i) {
      const temp = array[i];
      array[i] = array[minIndex];
      array[minIndex] = temp;
    }
  }

  return array;
}

// 示例用法
const arr = [5, 2, 4, 7, 1, 9, 3];
const sortedArr = selectionSort(arr);
console.log("排序后的数组:", sortedArr);

插入排序

插入排序是一种简单且高效的排序算法,它通过构建有序序列,对未排序的元素逐个插入到有序序列的适当位置,从而完成整个数组的排序。

function insertionSort(array) {
  const length = array.length;

  for (let i = 1; i < length; i++) {
    const key = array[i];
    let j = i - 1;

    // 将大于 key 的元素向右移动
    while (j >= 0 && array[j] > key) {
      array[j + 1] = array[j];
      j--;
    }

    // 将 key 插入到正确位置
    array[j + 1] = key;
  }

  return array;
}

// 示例用法
const arr = [5, 2, 4, 7, 1, 9, 3];
const sortedArr = insertionSort(arr);
console.log("排序后的数组:", sortedArr);

快速排序

快速排序是一种常用且高效的排序算法,它基于分治的思想,通过选择一个基准元素将数组划分为较小和较大的两个子数组,然后对子数组进行递归排序,最终实现整个数组的排序。

function quickSort(array) {
  if (array.length <= 1) {
    return array;
  }

  const pivot = array[Math.floor(array.length / 2)];
  const less = [];
  const equal = [];
  const greater = [];

  for (let element of array) {
    if (element < pivot) {
      less.push(element);
    } else if (element > pivot) {
      greater.push(element);
    } else {
      equal.push(element);
    }
  }

  return [...quickSort(less), ...equal, ...quickSort(greater)];
}

// 示例用法
const arr = [5, 2, 4, 7, 1, 9, 3];
const sortedArr = quickSort(arr);
console.log("排序后的数组:", sortedArr);

归并排序

归并排序是一种高效的排序算法,它采用分治策略,将数组递归地划分为较小的子数组,然后将子数组合并为一个有序的数组,从而完成整个数组的排序。

function mergeSort(array) {
  if (array.length <= 1) {
    return array;
  }

  const middle = Math.floor(array.length / 2);
  const left = array.slice(0, middle);
  const right = array.slice(middle);

  return merge(mergeSort(left), mergeSort(right));
}

function merge(left, right) {
  const merged = [];
  let leftIndex = 0;
  let rightIndex = 0;

  while (leftIndex < left.length && rightIndex < right.length) {
    if (left[leftIndex] <= right[rightIndex]) {
      merged.push(left[leftIndex]);
      leftIndex++;
    } else {
      merged.push(right[rightIndex]);
      rightIndex++;
    }
  }

  // 将剩余的元素添加到 merged 数组中
  while (leftIndex < left.length) {
    merged.push(left[leftIndex]);
    leftIndex++;
  }

  while (rightIndex < right.length) {
    merged.push(right[rightIndex]);
    rightIndex++;
  }

  return merged;
}

// 示例用法
const arr = [5, 2, 4, 7, 1, 9, 3];
const sortedArr = mergeSort(arr);
console.log("排序后的数组:", sortedArr);

堆排序

堆排序是一种基于二叉堆的排序算法,它利用堆的性质来实现排序。首先将待排序的元素构建成一个最大堆(或最小堆),然后反复从堆中取出最大(或最小)元素,将其放置在已排序部分的末尾,最终完成排序。

function heapSort(array) {
  buildMaxHeap(array);

  for (let i = array.length - 1; i > 0; i--) {
    swap(array, 0, i);
    heapify(array, 0, i);
  }

  return array;
}

function buildMaxHeap(array) {
  const length = array.length;
  const startIndex = Math.floor(length / 2) - 1;

  for (let i = startIndex; i >= 0; i--) {
    heapify(array, i, length);
  }
}

function heapify(array, index, heapSize) {
  const left = 2 * index + 1;
  const right = 2 * index + 2;
  let largest = index;

  if (left < heapSize && array[left] > array[largest]) {
    largest = left;
  }

  if (right < heapSize && array[right] > array[largest]) {
    largest = right;
  }

  if (largest !== index) {
    swap(array, index, largest);
    heapify(array, largest, heapSize);
  }
}

function swap(array, i, j) {
  const temp = array[i];
  array[i] = array[j];
  array[j] = temp;
}

// 示例用法
const arr = [5, 2, 4, 7, 1, 9, 3];
const sortedArr = heapSort(arr);
console.log("排序后的数组:", sortedArr);
0

评论区