排序算法总结
一、常用排序算法
二、使用场景
排序算法 | 适用场景 | 时间复杂度(平均) | 时间复杂度(最坏) | 空间复杂度 | 是否稳定 |
---|---|---|---|---|---|
快速排序(Quick Sort) | 大规模数据、随机数据、数组排序 | O(n log n) | O(n²)(选错 Pivot) | O(log n)(原地排序) | ❌ 不稳定 |
插入排序(Insertion Sort) | 小规模数据、几乎有序数据、在线动态插入 | O(n²) | O(n²) | O(1)(原地排序) | ✅ 稳定 |
归并排序(Merge Sort) | 链表排序、大数据量、需要稳定排序 | O(n log n) | O(n log n) | O(n)(额外存储) | ✅ 稳定 |
三、Array.prototype.sort()
JavaScript 的 sort()
方法默认按 Unicode 码点排序:
console.log(["10", "2", "30"].sort()); // ["10", "2", "30"]
为什么 "10"
排在 "2"
前面?
"1"
的 Unicode 码点是 49"2"
的 Unicode 码点是 50- "10" 先比较 "1" 和 "2","1" < "2",所以 "10" 被认为比 "2" 小。
sort内部使用了什么算法?
JavaScript 的 sort()
方法在不同的 JavaScript 引擎(如 V8、SpiderMonkey、JavaScriptCore)中可能使用不同的排序算法。
目前,V8 引擎(Chrome、Node.js)使用的是 Timsort
,而一些其他引擎可能会使用 快速排序(Quick Sort)或归并排序(Merge Sort)
Timsort 是 归并排序(Merge Sort)+ 插入排序(Insertion Sort) 的混合排序算法,具有以下特点:
- 分块(Runs):先找到数组中的有序片段(Runs)。
- 插入排序(Insertion Sort):对小的有序片段进行插入排序(适用于小数据)。
- 归并排序(Merge Sort):再合并有序片段,提高排序效率。