怎样权衡无序数组与有序数组?
查看完整题解
参考回答
直接回答
这里的“有序”按元素已经依比较规则排好来理解。无序数组通常需要逐个查找;有序数组能二分查找,但维持顺序时插入或删除往往要移动元素。选择时看查询与更新的比例、是否需要按顺序输出,以及数据量,不能只比较一次查找的复杂度。
讲清原理
无序数组找一个普通值,最坏要查看全部 n 个元素,成本 O(n)。有序数组把搜索区间反复减半,比较次数 O(log n);但前提是数组按同一规则排序。
静态数据反复查询,可以先花 O(n log n) 排序,再复用顺序。数据频繁变化时,每次移动后半段元素的成本可能超过二分节省的时间;还应考虑哈希表、树或批量排序等其他结构。普通数组长度固定,扩容还需要另建数组。
例子与易错点
Java 21 的 main 片段:
int[] ids = {9, 2, 5};
java.util.Arrays.sort(ids);
System.out.println(java.util.Arrays.binarySearch(ids, 5));
System.out.println(java.util.Arrays.binarySearch(ids, 4));
输出 1 和 -2。负结果编码了插入位置,不能一律当成 -1。数组尚未排序,或者排序与查找所用的比较器不同,就不能依赖二分结果;出现重复值时,也不保证返回第一个匹配项。
相关题:第 11 题、第 21 题、第 31 题。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。