当前位置:看书小说 > 其他小说 > IT入门到精通及应用领域 > 第8章 常用学习算法数据结构3

第8章 常用学习算法数据结构3

<< 上一章 返回目录 下一章 >>
    - 堆排序(heap sort)

    堆排序(heap sort)是一种基于比较的排序算法。它将数列构建成一个大顶堆(或小顶堆),然后依次将根节点与最后一个叶子节点交换,并重新调整堆结构。这样,每一次交换都会将当前最大值(或最小值)移到数列的末端,最终得到一个有序数列。

    堆排序的基本步骤如下:

    1 将数列构建成一个大顶堆(或小顶堆)。

    2 交换根节点(最大值或最小值)与最后一个叶子节点。

    3 重新调整堆结构,使其保持大顶堆(或小顶堆)特性。

    4 对新的数列重复步骤2和3,直到整个数列有序。

    以下是一个堆排序的示例实现(使用javascript):

    ```javascript

    function heapsort(arr) {

    const n = arrlength;

    // 构建大顶堆

    for (let i = mathfloor(n / 2) - 1; i >= 0; i--) {

    heapify(arr, n, i);

    }

    // 循环交换根节点和最后一个叶子节点

    for (let i = n - 1; i > 0; i--) {

    // 将最大值移到数列的末端

    [arr[0], arr[i]] = [arr[i], arr[0]];

    // 重新调整堆结构

    heapify(arr, i, 0);

    }

    return arr;

    }

    function heapify(arr, n, i) {

    const largest = i;

    const left = 2  i + 1;

    const right = 2  i + 2;

    if (left < n && arr[left] > arr[largest]) {

    largest = left;

    }

    if (right < n && arr[right] > arr[largest]) {

    largest = right;

    }

    if (largest !== i) {

    // 交换节点

    [arr[i], arr[largest]] = [arr[largest], arr[i]];

    // 递归调整堆结构

    heapify(arr, n, largest);

    }

    }

    const arr = [64, 34, 25, 12, 22, 11, 90];

    consolelog(heapsort(arr)); // 输出: [11, 12, 22, 25, 34, 64, 90]

    ```

    堆排序的平均时间复杂度为o(nlogn),在所有相同时间复杂度的排序算法中,其性能较好。堆排序在处理大数据集时具有稳定的性能,但在处理小规模数据集时,由于堆结构调整的开销,性能可能不如其他排序算法。

    2 查找算法:

    - 线性查找(linear search)

    线性查找(linear search)是一种简单的查找算法,用于在已排序的数列中查找特定元素。线性查找的基本思想是按顺序依次比较每个元素,直到找到目标元素或遍历完整个数列。

    线性查找的基本步骤如下:

    1 从数列的第一个元素开始,依次比较每个元素与目标元素。

    2 如果当前元素与目标元素相同,则查找成功,返回当前元素的索引。

    3 如果遍历完整个数列仍未找到目标元素,则查找失败,返回-1或null(表示目标元素不存在于数列中)。

    以下是一个线性查找的示例实现(使用javascript):

    ```javascript

    function linearsearch(arr, target) {

    for (let i = 0; i < arrlength; i++) {

    if (arr[i] === target) {

    return i;

    }

    }

    return -1; // 目标元素不存在于数列中

    }

    const arr = [1, 3, 5, 7, 9];

    const target = 7;

    const index = linearsearch(arr, target);

    if (index !== -1) {

    consolelog(`目标元素 {target} 在数列中的索引为 {index}`);

    } else {

    consolelog(`目标元素 {target} 不存在于数列中`);

    }

    ```

    线性查找的时间复杂度为o(n),其中n是数列的元素个数。尽管线性查找在大部分情况下性能较差,但它是一种简单且易于理解的查找算法。在实际应用中,线性查找通常仅适用于小型数据集。对于大型数据集,可以采用更高效的查找算法,如二分查找(binary search)。
<< 上一章 返回目录 下一章 >>
添加书签