当前位置:首页 > JavaScript

js用栈实现排序

2026-01-31 04:57:47JavaScript

使用栈实现排序的方法

在JavaScript中,可以通过栈(Stack)的特性实现排序功能。以下是两种常见的基于栈的排序方法:单调栈排序和模拟递归排序。

单调栈排序

单调栈是一种特殊的栈结构,栈内元素保持单调递增或递减的顺序。通过单调栈可以实现对数组的排序。

function sortWithStack(arr) {
    const stack = [];
    const tempStack = [];

    for (const num of arr) {
        while (stack.length > 0 && stack[stack.length - 1] < num) {
            tempStack.push(stack.pop());
        }
        stack.push(num);
        while (tempStack.length > 0) {
            stack.push(tempStack.pop());
        }
    }

    return stack;
}

// 示例
const arr = [5, 3, 8, 1, 2];
console.log(sortWithStack(arr)); // 输出 [8, 5, 3, 2, 1]

说明

  • 主栈stack用于存储排序后的结果。
  • 辅助栈tempStack用于临时存放需要调整顺序的元素。
  • 每次将元素压入主栈时,确保主栈的栈顶元素始终比当前元素大(或小),否则将栈顶元素弹出到辅助栈中。

模拟递归排序(类似快速排序)

通过两个栈模拟递归调用的过程,实现类似快速排序的分治策略。

function quickSortWithStack(arr) {
    const stack = [];
    stack.push(0);
    stack.push(arr.length - 1);

    while (stack.length > 0) {
        const high = stack.pop();
        const low = stack.pop();

        if (low < high) {
            const pivotIndex = partition(arr, low, high);
            stack.push(low);
            stack.push(pivotIndex - 1);
            stack.push(pivotIndex + 1);
            stack.push(high);
        }
    }

    return arr;
}

function partition(arr, low, high) {
    const pivot = arr[high];
    let i = low - 1;

    for (let j = low; j < high; j++) {
        if (arr[j] < pivot) {
            i++;
            [arr[i], arr[j]] = [arr[j], arr[i]];
        }
    }

    [arr[i + 1], arr[high]] = [arr[high], arr[i + 1]];
    return i + 1;
}

// 示例
const arr = [5, 3, 8, 1, 2];
console.log(quickSortWithStack(arr)); // 输出 [1, 2, 3, 5, 8]

说明

  • 使用栈模拟递归调用的过程,避免递归带来的堆栈溢出问题。
  • partition函数用于划分数组并返回基准值的正确位置。
  • 栈中存储的是待排序子数组的边界(lowhigh)。

方法对比

  1. 单调栈排序

    • 适合实现简单的单调排序(如降序或升序)。
    • 时间复杂度为O(n²),空间复杂度为O(n)。
  2. 模拟递归排序

    js用栈实现排序

    • 更接近快速排序的实现,效率较高。
    • 平均时间复杂度为O(n log n),空间复杂度为O(log n)。

根据实际需求选择合适的方法。单调栈适用于简单场景,而模拟递归排序更适合大规模数据排序。

标签: js
分享给朋友:

相关文章

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…

原生js实现轮播图

原生js实现轮播图

基本结构搭建 HTML部分需要包含轮播图容器、图片列表及导航按钮。结构示例如下: <div class="slider-container"> <div class="slid…

js实现换肤

js实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #349…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

js实现游标

js实现游标

使用JavaScript实现游标 在JavaScript中,可以通过操作DOM元素的cursor样式属性来实现自定义游标效果。以下是几种常见的实现方法: 修改默认鼠标指针样式 通过CSS的curso…

vue实现js休眠

vue实现js休眠

实现 JavaScript 休眠的方法 在 Vue 中实现 JavaScript 休眠(延迟执行)可以通过以下方式实现。由于 JavaScript 本身没有内置的 sleep 函数,通常使用 Prom…