当前位置:首页 > 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]

说明

js用栈实现排序

  • 主栈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]

说明

js用栈实现排序

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

方法对比

  1. 单调栈排序

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

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

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

标签: js
分享给朋友:

相关文章

js实现倒计时

js实现倒计时

使用 setInterval 实现倒计时 通过 setInterval 定时器每秒更新剩余时间,适用于简单倒计时场景。 function countdown(seconds, callbac…

js 实现倒计时

js 实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是两种常见实现方式。 使用 setInterval 实…

js 实现vue

js 实现vue

Vue.js 的基本实现 在 JavaScript 中实现 Vue.js 的核心功能,可以通过数据绑定、响应式系统和虚拟 DOM 来实现。以下是实现 Vue.js 核心功能的简化版本。 数据响应式系…

js实现百叶窗

js实现百叶窗

使用CSS和JavaScript实现百叶窗效果 通过CSS动画和JavaScript事件监听可以实现百叶窗效果。核心思路是将内容区域分割为多个条状元素,通过控制它们的展开/折叠状态来模拟百叶窗。 &…

js实现游标

js实现游标

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

js实现投球

js实现投球

实现投球动画的基本思路 使用JavaScript和CSS动画结合的方式模拟投球效果。核心是通过改变元素的位置、旋转和缩放属性,配合定时器或CSS过渡实现平滑动画。 创建基础HTML结构 <di…