Java 后端面试题库 / 全部题解免费阅读理解原理,有条理地回答

怎样权衡无序数组与有序数组?

查看完整题解

参考回答

直接回答

这里的“有序”按元素已经依比较规则排好来理解。无序数组通常需要逐个查找;有序数组能二分查找,但维持顺序时插入或删除往往要移动元素。选择时看查询与更新的比例、是否需要按顺序输出,以及数据量,不能只比较一次查找的复杂度。

讲清原理

无序数组找一个普通值,最坏要查看全部 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 题。

这道题,你掌握得怎么样?

掌握程度由你主动标记,阅读和收藏不会自动改变状态。