用到递归、合并,所以叫归并。
public static int[] data = {3,7,8,0,9,5,4,1,6,2}; /** * 递归 * @param temp 临时数组 * @param sIndex 开始索引 * @param eIndex 结束索引 */ private static void recursion(int[] temp, int sIndex, int eIndex){ if(sIndex == eIndex){ return ; }else{ int oneEnd = (sIndex + eIndex) / 2; //分成2半,不能整除放前面 recursion(temp, sIndex, oneEnd); //前个 recursion(temp, oneEnd + 1, eIndex); //后个 merge(temp, sIndex, oneEnd, eIndex); } } /** * 合并 * @param temp 临时数组 * @param oneStart 合并的第一个数组开始索引 * @param oneEnd 合并的第一个数组结束索引 * @param twoEnd 合并的第二个数组结束索引 */ private static void merge(int[] temp, int oneStart, int oneEnd, int twoEnd){ int twoStart = oneEnd + 1; //合并的第二个数组开始索引 int start = oneStart; //记录开始索引,以便放回原数组 int end = twoEnd; //记录结束索引,以便放回原数组 int i = 0; //计数器 while(oneStart <= oneEnd && twoStart <= twoEnd){ if(data[oneStart] < data[twoStart]){ temp[i++] = data[oneStart++]; }else{ temp[i++] = data[twoStart++]; } } while(oneStart <= oneEnd){//处理剩余 temp[i++] = data[oneStart++]; } while(twoStart <= twoEnd){//处理剩余 temp[i++] = data[twoStart++]; } //放回原数组 for(int j = start; j <= end; j++){ data[j] = temp[j - start]; } } public static void main(String[] args) { int[] space = new int[data.length]; recursion(space, 0, data.length - 1); System.out.println(Arrays.toString(data)); }
相关推荐
9. 递归的归并排序:归并排序通常使用递归实现,通过递归调用自身对数组的前半部分和后半部分进行排序,然后用归并操作合并结果。这种递归方式使算法具有清晰的逻辑结构。 10. 基数排序:基数排序是一种非比较型...
c++实现的合并排序算法 用递归和非递归两种方式实现的
9. **递归的归并排序**:归并排序的实现方式之一,直接使用递归调用自身来完成数组的划分和合并过程,其基本思想与归并排序一致。 10. **基数排序**(Radix Sort):一种非比较型整数排序算法,其原理是将整数按...
在传统递归实现中,归并排序通过不断分割数组直到每个子数组只有一个元素,然后逐步合并这些子数组来完成排序。而非递归版本的归并排序,则避免了递归调用,转而使用循环和迭代的方式实现,这样可以减少函数调用开销...
非递归的归并排序与传统的递归实现不同,它通过循环结构而不是函数调用来完成排序过程。这种方法有时被认为更有利于资源管理,因为它避免了递归调用带来的额外开销,如堆栈空间的消耗。 在C++中实现非递归归并排序...
2. **消除递归的归并排序** 消除递归的归并排序是归并排序的一种优化,它通过使用迭代而非递归来减少系统调用。这可以通过使用栈或者队列来保存子数组的边界信息,然后逐步处理这些子数组来实现。这种方法对于大...
归并排序的非递归实现是指使用迭代的方式实现归并排序算法,而不是使用递归的方式。下面是对归并排序的非递归实现的知识点总结: 一、归并排序的基本概念 归并排序是一种常用的排序算法,它的基本思想是将需要排序...
2. 数据的存储:在归并排序中,我们需要将原始数组分成两个小数组,然后对这两个小数组进行排序。因此,需要注意数据的存储,确保数据的正确性和完整性。 3. 合并的实现:在归并排序中,我们需要将两个有序表合并...
6. **二路归并排序**:将数组分成两半,分别对左右两部分进行排序,然后合并两个已排序的部分。C#实现中,通常需要额外的空间来存储中间结果,所以是稳定的排序算法。二路归并排序的时间复杂度在所有情况下都保持在O...
以下是关于"冒泡排序,选择排序,插入排序,希尔排序,堆排序,归并排序,快速排序"这七种常见排序算法的源码实现及相关知识点的详细解释: 1. **冒泡排序**:冒泡排序是一种简单的排序算法,它重复地遍历待排序的...
4. 归并排序的合并过程中要注意避免不必要的元素复制,可以使用指针或迭代器来减少内存操作。 这些排序算法各有优缺点,适用场景也不同。希尔排序适合处理大规模且接近有序的数据;快速排序在大部分情况下性能优秀...
- **空间复杂度**:O(n),因为归并排序需要额外的空间用于临时存储合并后的子序列。 **3. C++实现代码** ```cpp void Merge(int r[], int r1[], int s, int m, int t) { int i, j, k; i = s; j = m + 1; k = s; ...
二分归并排序通常使用递归实现,MATLAB中的实现可能涉及两个辅助函数,一个用于分割数组,另一个用于合并已排序的子数组。这种算法在处理大数据集时效率高,时间复杂度为O(n log n)。 3. **归并排序**(Merge Sort...
4. 归并排序:同样基于分治策略,将数组分成两半,分别进行排序,然后合并两个已排序的子数组。归并排序是稳定的排序算法,时间复杂度为O(n log n)。 5. 插入排序:对于未排序的元素,依次将其插入到已排序部分的...
归并排序是分治策略的典型应用,将数组分成两个子数组,分别进行排序,再合并成一个有序数组。它保证了稳定性和O(n log n)的时间复杂度,但需要额外的空间来存储子数组,空间复杂度为O(n)。 4. **插入排序**: 插入...
快速排序、归并排序和堆排序都是经典且高效的排序算法,它们各自具有独特的实现方式和性能特点。这篇文章将详细探讨这三个排序算法,并对比它们的时间复杂度。 首先,我们来看快速排序。快速排序由C.A.R. Hoare在...
2. 对每个子数组进行归并排序,这一步会递归地进行,直到子数组只剩下一个元素。 3. 合并两个已排序的子数组,这是归并排序的核心。合并过程中,比较两个子数组的首元素,选择较小的一个放入新的数组,并移动较小...
快速排序通过一次划分将数组分成两部分,归并排序则是先递归分割再合并。在实际应用中,快速排序通常具有较高的平均性能,但归并排序由于其稳定性和在某些情况下的更优性能,也有其独特的优势。 通过上述代码示例,...
快速排序可以采用递归或非递归方式,而归并排序则通常使用递归。在“快速排序与归并排序比较(C++)”的程序中,可能包含了两种排序算法的自定义实现,并通过实际运行比较它们的运行时间。 在分析性能时,我们通常...
归并排序的基本思想是将数组分为两部分,然后将这两部分单独排序,最后将它们合并为一个有序的数组。 代码分析 在给定的代码中,我们可以看到,作者使用了 C++ 语言实现了快速排序和冒泡排序。作者使用了模板函数...