Menu
×
   ❮   
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 基数排序时间复杂度


请参阅 此页面 以了解时间复杂度的通用解释。


基数排序时间复杂度

基数排序 算法一次对非负整数排序一位。

有 \(n\) 个需要排序的值,\(k\) 是最高值中的位数。

基数排序运行时,每个值都会被移动到基数数组中,然后每个值都会被移回初始数组。因此,有 \(n\) 个值被移动到基数数组中,\(n\) 个值被移回。这给了我们 \(n + n=2 \cdot n\) 个操作。

并且上述描述的移动值需要对每一位进行。这给了我们总共 \(2 \cdot n \cdot k\) 个操作。

这给了我们基数排序的时间复杂度

\[ O(2 \cdot n \cdot k) = \underline{\underline{O(n \cdot k)}} \]

基数排序可能是最快的排序算法,只要位数 \(k\) 相对于值数 \(n\) 保持相对较小。

我们可以想象一种场景,其中位数 \(k\) 与值数 \(n\) 相同,在这种情况下,我们得到时间复杂度 \(O(n \cdot k)=O(n^2)\) ,这相当慢,并且具有与例如冒泡排序相同的时间复杂度。

我们还可以想象一种场景,其中位数 \(k\) 随着值数 \(n\) 的增长而增长,因此 \(k(n)= \log n\)。在这种情况下,我们得到时间复杂度 \(O(n \cdot k)=O(n \cdot \log n )\),这与例如快速排序相同。

请参见下图中基数排序的时间复杂度。

Time Complexity

基数排序模拟

运行基数排序的不同模拟,以查看操作数如何介于最坏情况场景 \(O(n^2)\)(红线)和最佳情况场景 \(O(n)\)(绿线)之间。

{{ this.userX }}

{{ this.userK }}

操作数:{{ operations }}

 

表示不同值的条形图已按比例缩放以适合窗口,使其看起来不错。这意味着 7 位数的值看起来仅仅比 2 位数的值大 5 倍,但实际上,7 位数的值实际上比 2 位数的值大 5000 倍!

如果我们保持 \(n\) 和 \(k\) 固定,上述模拟中的“随机”、“降序”和“升序”选项会导致相同数量的操作。这是因为这三种情况下的操作都是一样的。



×

Contact Sales

If you want to use W3Schools services as an educational institution, team or enterprise, send us an e-mail:
[email protected]

Report Error

If you want to report an error, or if you want to make a suggestion, send us an e-mail:
[email protected]

W3Schools is optimized for learning and training. Examples might be simplified to improve reading and learning. Tutorials, references, and examples are constantly reviewed to avoid errors, but we cannot warrant full correctness of all content. While using W3Schools, you agree to have read and accepted our terms of use, cookie and privacy policy.

Copyright 1999-2024 by Refsnes Data. All Rights Reserved. W3Schools is Powered by W3.CSS.