菜单
×
   ❮   
HTML CSS JAVASCRIPT SQL PYTHON JAVA PHP HOW TO W3.CSS C C++ C# BOOTSTRAP REACT MYSQL JQUERY EXCEL XML DJANGO NUMPY PANDAS NODEJS R TYPESCRIPT ANGULAR GIT POSTGRESQL MONGODB ASP AI GO KOTLIN SASS VUE DSA GEN AI SCIPY AWS CYBERSECURITY DATA SCIENCE
     ❯   

DSA 插入排序时间复杂度


有关时间复杂度的通用解释,请参阅此页面


插入排序时间复杂度

插入排序最坏情况的场景是数组已经排序,但数值是从大到小排列的。这是因为在这种情况下,每个新值都必须“穿过”整个已排序的数组部分。

以下是插入排序算法为前几个元素执行的操作:

  • 第 1 个值已在正确的位置。
  • 第 2 个值必须与第 1 个值进行比较并移到其后。
  • 第 3 个值必须与前面两个值进行比较并移到它们之后。
  • 第 3 个值必须与前面三个值进行比较并移到它们之后。
  • 以此类推……

如果我们继续这种模式,那么对于 \(n\) 个值,总操作次数为:

\[1+2+3+...+(n-1)\]

这是数学中一个众所周知的数列,可以写成:

\[ \frac{n(n-1)}{2} = \frac{n^2}{2} - \frac{n}{2} \]

对于非常大的 \(n\),\(\frac{n^2}{2}\) 项占主导地位,因此我们可以通过移除第二项 \(\frac{n}{2}\) 来简化。

使用大 O 符号,插入排序算法的时间复杂度为:

\[ O(\frac{n^2}{2}) = O(\frac{1}{2} \cdot n^2) = \underline{\underline{O(n^2)}} \]

时间复杂度可以显示如下:

Time Complexity for Insertion Sort

如您所见,当值 \(n\) 增加时,插入排序使用的时间会快速增加。


插入排序模拟

使用下面的模拟来查看理论时间复杂度 \(O(n^2)\)(红线)与实际插入排序操作次数的比较。

{{ this.userX }}

操作次数:{{ operations }}

 

对于插入排序,最佳、平均和最坏情况场景之间存在很大差异。您可以通过运行上面的不同模拟来查看。

上面的红线代表理论上的上限时间复杂度 \(O(n^2)\),而实际函数是 \(1.07 \cdot n^2\)。

请记住,如果存在一个正常量 \(C\) 使得 \(C \cdot g(n)>f(n)\),则称函数 \(f(n)\) 为 \(O(g(n))\)。

在这种情况下,\(f(n)\) 是插入排序使用的操作数,\(g(n)=n^2\),而 \(C=1.07\)。



×

联系销售

如果您想将 W3Schools 服务用于教育机构、团队或企业,请发送电子邮件给我们
sales@w3schools.com

报告错误

如果您想报告错误,或想提出建议,请发送电子邮件给我们
help@w3schools.com

W3Schools 经过优化,旨在方便学习和培训。示例可能经过简化,以提高阅读和学习体验。教程、参考资料和示例会不断审查,以避免错误,但我们无法保证所有内容的完全正确性。使用 W3Schools 即表示您已阅读并接受我们的使用条款Cookie 和隐私政策

版权所有 1999-2024 Refsnes Data。保留所有权利。W3Schools 由 W3.CSS 提供支持