与“排序算法”相关的TAG标签
拓扑排序必须基于有向无环图(DAG),否则无解;C++实现时若含环,算法可能失败或返回不完整结果;Kahn算法最易实现且天然支持环检测,是生产环境首选。
JavaScript中应直接使用Array.prototype.sort(),因其在现代引擎中已优化为Timsort或混合排序,平均O(nlogn),手写算法反而增加风险;关键在于正确编写比较函数,如数字排序需用(a,b)=>a-b,避免不一致或耗时操作。
Java排序应优先使用Arrays.sort()或Collections.sort():前者用于各类数组(基本类型用双轴快排,引用类型用TimSort),后者仅适用于List;自定义对象排序依场景选Comparable或Comparator,Lambda更简洁;int[]等基本类型数组不支持Comp...
LinkedHashMap默认按插入顺序遍历,设accessOrder=true后改为访问顺序(LRU),每次get或put都会将节点移至链表尾,头节点为最久未访问项;需重写removeEldestEntry()实现自动淘汰。
std::sort通常比手写快排更快,因其采用混合算法(introsort):小数组用插入排序、深递归切堆排序、主体为三数取中+尾递归优化的快排,兼顾平均性能、最坏复杂度与缓存友好性。
快速排序的核心逻辑是分治+原地分区:每次选pivot将数组划分为小于、等于、大于三部分,用双指针原地交换实现O(logn)空间复杂度。
希尔排序的核心是分组插入而非改进版冒泡,关键在于gap序列设计;推荐Knuth序列(1,4,13,40,…),用gap=3*gap+1逆向生成并倒序使用,避免退化,实测比原始序列快约30%。
希尔排序应选Knuth序列(h=3h+1)而非除2序列,以避免退化为O(n²);内层插入排序需省略冗余边界检查;支持泛型需用模板与函数对象。
归并排序的核心是分治三步:split切分、merge合并、combine写回;merge需用临时数组、半开区间、正确边界控制,且应复用辅助空间而非重复分配。
选择排序的核心逻辑是每轮在未排序部分找最小(或最大)值并与当前首位交换,本质为“挑出最值+归位”,不依赖相邻比较,无法提前终止,时间复杂度恒为O(n²)。
