<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://aftermathof.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://aftermathof.github.io/" rel="alternate" type="text/html" /><updated>2026-03-10T15:24:58+00:00</updated><id>https://aftermathof.github.io/feed.xml</id><title type="html">Home</title><subtitle>Your Name&apos;s academic portfolio</subtitle><author><name>会飞的猪</name><email>13451950278@163.com</email></author><entry><title type="html">Lesson1</title><link href="https://aftermathof.github.io/posts/2026/03/Lesson1" rel="alternate" type="text/html" title="Lesson1" /><published>2026-03-09T00:00:00+00:00</published><updated>2026-03-09T00:00:00+00:00</updated><id>https://aftermathof.github.io/posts/2026/03/Lesson1</id><content type="html" xml:base="https://aftermathof.github.io/posts/2026/03/Lesson1"><![CDATA[<h1 id="排序算法堆栈排序-stack-sorting">排序算法：堆栈排序 (Stack-Sorting)</h1>

<p>堆栈排序是指利用一个后进先出的堆栈结构，按照特定规则对排列进行重新排列的过程。</p>

<h2 id="1-算法规则与定义">1. 算法规则与定义</h2>

<p>给定一个排列 $\pi = \pi_1 \pi_2 \cdots \pi_n \in S_n$，通过堆栈 $stack$ 操作得到输出排列 $S(\pi)$。</p>

<h3 id="操作步骤">操作步骤</h3>
<ul>
  <li><strong>Step 1:</strong> $\pi_1$ 入栈。</li>
  <li><strong>Step 2:</strong> 依次处理后续元素 $\pi_i$：
    <ol>
      <li>若 $\pi_i &lt; M$（$M$ 为当前栈顶元素），将 $\pi_i$ 入栈。</li>
      <li>若 $\pi_i &gt; M$，则将 $M$ 出栈并加入输出序列。</li>
      <li>重复第 2 步，直到 $\pi_i$ 能够入栈。</li>
    </ol>
  </li>
  <li><strong>最终状态:</strong> 待所有输入处理完后，将栈内剩余元素依次弹出。</li>
  <li><strong>结果:</strong> 得到最终的出栈排列 $S(\pi) = \sigma_1 \sigma_2 \cdots \sigma_n$。</li>
</ul>

<h2 id="2-示例">2. 示例</h2>

<p><strong>例：</strong> 设 $\pi = 3142$</p>

<ol>
  <li>$3$ 入栈。</li>
  <li>$1 &lt; 3$，则 $1$ 入栈（栈内：$3, 1$）。</li>
  <li>处理 $4$：因 $4 &gt; 1$，弹出 $1$；因 $4 &gt; 3$，弹出 $3$；随后 $4$ 入栈（输出序列目前为：$1, 3$）。</li>
  <li>$2 &lt; 4$，则 $2$ 入栈（栈内：$4, 2$）。</li>
  <li>扫描结束，依次弹出 $2, 4$。
最终得到：$S(3142) = 1342$。</li>
</ol>

<h2 id="3-核心引理递归分解">3. 核心引理：递归分解</h2>

<p>将排列 $\pi$ 分解为：
\(\pi = \pi_L \cdot n \cdot \pi_R\)
其中 $n$ 是排列中的最大元素，$\pi_L$ 是 $n$ 左侧的部分，$\pi_R$ 是 $n$ 右侧的部分。</p>

<p><strong>引理内容：</strong>
\(S(\pi) = S(\pi_L) \cdot S(\pi_R) \cdot n\)</p>

<h2 id="4-定理堆栈可排序性与-231-模式">4. 定理：堆栈可排序性与 231-模式</h2>

<p><strong>定理：</strong> 对于 $\pi \in S_n$，使得 $S(\pi) = id$（即 $1, 2, \dots, n$）的充分必要条件是 $\pi$ 不包含 <strong>231-pattern</strong>。</p>

<blockquote>
  <p><strong>231-pattern:</strong> 指存在下标 $i &lt; j &lt; k$，使得其对应数值的大小顺序为 $\pi_k &lt; \pi_i &lt; \pi_j$。</p>
</blockquote>

<h3 id="证明">证明</h3>

<h4 id="-必要性-implies">① 必要性 ($\implies$)</h4>
<p>若 $S(\pi) = id$，则 $\pi$ 不包含 231-pattern。
反证法：若 $\pi$ 包含 231-pattern，根据引理 $\pi = \pi_L \cdot n \cdot \pi_R$：</p>
<ul>
  <li>若 $\pi_L$ 中包含较大的数，而 $\pi_R$ 中包含较小的数，则在输出序列 $S(\pi) = S(\pi_L)S(\pi_R)n$ 中，较小的数会排在较大的数后面，导致 $S(\pi) \neq id$。</li>
</ul>

<h4 id="-充分性-impliedby">② 充分性 ($\impliedby$)</h4>
<p>若 $\pi$ 不包含 231-pattern，则 $S(\pi) = id$。</p>
<ul>
  <li><strong>使用数学归纳法 (Induction)：</strong>
    <ul>
      <li>$n=2$ 时：$S(12)=12$，$S(21)=12$，均符合。</li>
      <li>假设对 $n-1$ 阶排列成立。</li>
      <li>对于 $n$ 阶排列 $\pi = \pi_L \cdot n \cdot \pi_R$：
        <ul>
          <li>若 $\pi$ 不含 231-pattern，则 $\pi_L$ 中的所有元素均小于 $\pi_R$ 中的元素。</li>
          <li>即 $\pi_L = {1, \dots, i-1}$ 且 $\pi_R = {i, \dots, n-1}$。</li>
          <li>根据归纳假设，$S(\pi_L)$ 和 $S(\pi_R)$ 均递增，代入引理得 $S(\pi) = id$。</li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<h2 id="5-outline">5. Outline</h2>

\[\begin{aligned}
S(\pi) = id &amp;\iff S(\pi_L)S(\pi_R) \cdot n = id \\
&amp;\iff S(\pi_L) = 1 \cdots i-1 \text{ 且 } S(\pi_R) = i \cdots n-1 \\
&amp;\stackrel{\text{Induction}}{\iff} \pi_L, \pi_R \text{ 均不含 231-pattern 且 } \pi_L &lt; \pi_R \\
&amp;\iff \pi \text{ 不包含 231-pattern}
\end{aligned}\]]]></content><author><name>会飞的猪</name><email>13451950278@163.com</email></author><category term="离散结构及其算法" /><summary type="html"><![CDATA[排序算法：堆栈排序 (Stack-Sorting)]]></summary></entry></feed>