归并的核心思想是归并。归并的速度直接影响到算法的快慢。
1. 简单插入归并
public static class MergeSorter1 implements Sorter { public void sort(int[] values) { int step = 1; while (step <= values.length) { int index = 0; while (index < values.length) { int low, high, end = 0; if (index + step < values.length) { low = index; high = index + step; if (index + step + step < values.length) { end = index + step + step; } else { end = values.length; } merge(values, low, high, end); index = end; } else { break; } } step = 2 * step; } } private void merge(int[] values, int low, int high, int end) { while (high < end) { while (low < high) { if (values[low] <= values[high]) { low++; } else { break; } } if (low != high) { int temp = values[high]; for (int i = low; i <= high; ++i) { int _temp = values[i]; values[i] = temp; temp = _temp; } } high++; } } }
简单插入归并的性能打印:
.... take time: 654
2. 额外建立一个临时数组归并:
public static class MergeSorter2 implements Sorter { public void sort(int[] values) { int step = 1; while (step <= values.length) { int index = 0; while (index < values.length) { merge(values, index, index + step, index + step + step); index = index + step + step; } step = 2 * step; } } private void merge(int[] values, int low, int high, int end) { if (low >= values.length) { return; } if (high > values.length) { high = values.length; } if (end > values.length) { end = values.length; } int originLow = low; int originHigh = high; int originEnd = end; int[] tempValues = new int[end - low]; int p = 0; while (p < tempValues.length) { if (low < originHigh) { if (high == originEnd || values[low] <= values[high]) { tempValues[p] = values[low]; low++; p++; } } if (high < originEnd) { if (low == originHigh || values[low] >= values[high]) { tempValues[p] = values[high]; high++; p++; } } } for (int i = 0; i < tempValues.length; ++i) { values[originLow + i] = tempValues[i]; } } }
性能打印:
.... take time: 1520
3. 使用公用临时数组归并
public static class MergeSorter3 implements Sorter { public int[] tempValues; public void sort(int[] values) { boolean isInTemp = false; int[] originValues = values; tempValues = new int[values.length]; int step = 1; while (step <= values.length) { int index = 0; while (index < values.length) { merge(values, index, index + step, index + step + step); index = index + step + step; } // printValues(tempValues); int[] _tempValues = tempValues; tempValues = values; values = _tempValues; isInTemp = !isInTemp; step = 2 * step; } if (isInTemp) { for (int i = 0; i < values.length; ++i) { originValues[i] = values[i]; } } } private void merge(int[] values, int low, int high, int end) { if (low >= values.length) { return; } if (high > values.length) { high = values.length; } if (end > values.length) { end = values.length; } int pLow = low; int pHigh = high; int pMerged = low; while (pMerged < end) { if (pLow < high) { if (pHigh >= end) { tempValues[pMerged] = values[pLow]; pLow++; pMerged++; } else if (values[pLow] < values[pHigh]) { tempValues[pMerged] = values[pLow]; pLow++; pMerged++; } else if (values[pLow] == values[pHigh]) { tempValues[pMerged] = values[pLow]; pLow++; pMerged++; tempValues[pMerged] = values[pHigh]; pHigh++; pMerged++; } } if (pHigh < end) { if (pLow >= high) { tempValues[pMerged] = values[pHigh]; pHigh++; pMerged++; } else if (values[pLow] > values[pHigh]) { tempValues[pMerged] = values[pHigh]; pHigh++; pMerged++; } else if (values[pLow] == values[pHigh]) { tempValues[pMerged] = values[pLow]; pLow++; pMerged++; tempValues[pMerged] = values[pHigh]; pHigh++; pMerged++; } } } } }
时间打印:
.... take time: 784
4. 在算法3基础上进行优化
public static class MergeSorter4 implements Sorter { public int[] tempValues; public void sort(int[] values) { boolean isInTemp = false; int[] originValues = values; tempValues = new int[values.length]; int step = 1; while (step <= values.length) { int index = 0; while (index < values.length) { int end = index + step + step; merge(values, index, index + step, end); index = end; } // printValues(tempValues); int[] _tempValues = tempValues; tempValues = values; values = _tempValues; isInTemp = !isInTemp; step = 2 * step; } if (isInTemp) { for (int i = 0; i < values.length; ++i) { originValues[i] = values[i]; } } } private void merge(int[] values, int low, int high, int end) { if (low >= values.length) { return; } if (high > values.length) { high = values.length; } if (end > values.length) { end = values.length; } int pLow = low; int pHigh = high; int pMerged = low; while (pLow < high && pHigh < end) { if (values[pLow] <= values[pHigh]) { tempValues[pMerged++] = values[pLow++]; } else { tempValues[pMerged++] = values[pHigh++]; } } while (pLow < high) { tempValues[pMerged++] = values[pLow++]; } while(pHigh< end) { tempValues[pMerged++] = values[pHigh++]; } } }
打印时间:
.... take time: 573
5. Java SDK归并
public static class SDKSorter implements Sorter { public void sort(int[] values) { Arrays.parallelSort(values); } }
时间打印:
.... take time: 338
相关推荐
面试题目的多样性反映了应聘者需要具备全面的技术知识,包括但不限于基础知识、组件应用、性能优化、框架理解以及算法和逻辑思维能力。以下是对这些知识点的详细解析: 1. **基础知识**: - **Android体系结构**:...
- 排序算法:快速排序、归并排序、堆排序、冒泡排序等的实现与复杂度分析。 - 动态规划:背包问题、最长公共子序列、斐波那契数列等经典题目。 **第三章 Java面试题** **第一节 Java基础面试题** - Java语法:封装...
- **排序算法:** 如冒泡排序、快速排序、归并排序等。 - **链表操作:** 单链表、双链表的插入、删除等操作。 - **二叉树遍历:** 前序遍历、中序遍历、后序遍历等。 - **图的遍历:** 深度优先搜索(DFS)、广度优先...
四、Android面试题 Android面试题涵盖范围广泛,包括但不限于:Activity生命周期、Intent机制、BroadcastReceiver、Service、ContentProvider、Fragment、四大组件间通信、UI布局优化、性能调优(如内存泄漏检测、...
常见的排序算法有冒泡排序、选择排序、插入排序、快速排序、归并排序等,它们各有优缺点,需要根据实际需求来选择。搜索算法如二分查找适用于有序数组,而哈希查找则能提供近乎常数时间的查找速度。 3. **时间...
最后,常见面试算法题汇总部分,可能会包含排序算法(如冒泡、选择、插入、快速、归并排序)、查找算法(如二分查找)、链表操作、栈与队列的应用、图和树结构的题目,以及动态规划、贪心策略等复杂算法问题。...
- **合并策略**:可以使用归并排序的思想来合并两个已排序的数组。 - **中位数计算**:当两个数组合并后,可以根据数组长度来计算中位数。 ### 21. 多线程与并发 - **并发控制**:理解锁机制(如互斥锁、读写锁等)...
常见的算法类型有排序(如冒泡排序、快速排序、归并排序)、搜索(如二分查找、深度优先搜索、广度优先搜索)、动态规划、贪心算法等。算法分析通常关注时间复杂度和空间复杂度,这两个指标衡量了算法执行效率和内存...
- 算法:理解并掌握排序(快速排序、归并排序、堆排序等)、搜索(二分查找、哈希查找等)算法,以及图论和动态规划问题。 - 数据结构:熟练运用链表、数组、栈、队列、树(二叉树、平衡树、堆)和图等基本数据...
常见的算法类型包括排序(快速排序、归并排序等)、查找(二分查找、哈希查找等)、图论(最短路径、最小生成树等)以及动态规划。了解和熟练掌握这些基础算法是提升解题能力的关键。 2. **数据结构**:数据结构是...
2. **排序算法**:冒泡排序、插入排序、选择排序、快速排序、归并排序、堆排序、希尔排序、桶排序、计数排序、基数排序等。 3. **搜索算法**:深度优先搜索(DFS)、广度优先搜索(BFS)、二分查找、回溯法、贪心...
4. **算法与数据结构**:笔试题中常见的部分,包括排序算法(快速排序、归并排序等)、查找算法、图论问题、动态规划等,这些都是解决实际工程问题的基础。 5. **网络协议**:理解TCP/IP协议栈、HTTP/HTTPS协议、...
- **算法与数据结构**:排序算法(快速排序、归并排序等),查找算法(二分查找、哈希查找等),常用数据结构(栈、队列、树、图)。 - **设计模式**:单例、工厂、观察者等23种经典设计模式及其应用场景。 - **...
这份"IT行业面试题库"集合了众多公司的面试题目,涵盖了多个领域的专业知识,旨在帮助求职者更好地准备面试,提高成功几率。虽然压缩包看起来不大,但高压缩率意味着它包含的信息量非常丰富。 面试题库通常包括以下...
在IT行业中,尤其是在求职过程中,谷歌(Google)作为全球顶尖的科技公司,其笔试和面试题目经常被广大求职者视为衡量个人技术能力的重要标准。谷歌的面试流程通常涵盖算法、数据结构、系统设计、编程技能以及软技能...
【全国IT名企面试题集】是一份涵盖了广泛IT技术领域的面试题目集合,旨在帮助求职者准备进入知名IT企业的面试。这份资源包含了多个技术方向的问题,涵盖了编程基础、算法、操作系统、计算机网络、数据库、软件工程等...
这个名为“校招&社招面试真题及解析.zip”的压缩包文件显然是一个宝贵的资源,包含了各大知名企业的面试题目以及可能的解答。主要针对的是Java相关的知识,这表明了Java在当前IT行业的广泛应用和重要地位。 Java是...
13. **算法与数据结构**:面试中可能会有算法题目,例如排序(快速排序、归并排序、冒泡排序等)、查找(二分查找、哈希查找等)、图算法(Dijkstra、Floyd等)和树算法(二叉搜索树、AVL树、红黑树等)。...
- **归并排序**:稳定排序,时间复杂度为O(n log n)。 ### UML - **概念**:统一建模语言,用于软件工程的设计和文档化。 - **用途**:包括类图、序列图、用例图等。 ### Linux常用命令 - **基本命令**:`ls`、`...
然而,通常面试题目的常见标签可能包括“编程面试”、“Java”、“Python”、“C++”、“数据结构”、“算法”、“计算机网络”、“数据库”、“操作系统”等,这些都代表了IT面试中常见的考察点。 【压缩包子文件...