public class MergeSort {
public static void mergeSort(int[] data) {
System.out.println("开始排序:");
sort(data, 0, data.length - 1);
}
/*
* 将索引从left到right范围的数组元素进行归并排序 data 待排序数组 left 待排序数组的第一个元素索引 right
* 待排序数组的最后一个元素索引
*/
private static void sort(int[] data, int left, int right) {
// TODO Auto-generated method stub
if (left < right) {
// 找出中间索引
int center = (left + right) / 2;
// 对左边数组进行递归
sort(data, left, center);
// 对右边数组进行递归
sort(data, center + 1, right);
// 合并
merge(data, left, center, right);
}
}
/*
* 将两个数组进行归并,归并前两个数组已经有序,归并后依然有序 data 数组对象 left 左数组的第一个元素的索引 center
* 左数组的最后一个元素的索引,center+1是右数组第一个元素的索引 right 右数组的最后一个元素的索引
*/
private static void merge(int[] data, int left, int center, int right) {
// TODO Auto-generated method stub
int[] tmpArr = new int[data.length];
int mid = center + 1;
// third记录中间数组的索引
int third = left;
int tmp = left;
while (left <= center && mid <= right) {
// 从两个数组中取出最小的放入中间数组
if (data[left]<=(data[mid])) {
tmpArr[third++] = data[left++];
} else {
tmpArr[third++] = data[mid++];
}
}
// 剩余部分依次放入中间数组
while (mid <= right) {
tmpArr[third++] = data[mid++];
}
while (left <= center) {
tmpArr[third++] = data[left++];
}
// 将中间数组中的内容复制回原数组
while (tmp <= right) {
data[tmp] = tmpArr[tmp++];
}
System.out.println(Arrays.toString(data));
}
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] data = {1,33,12,10,8,0,89,100,20,23,98};
System.out.println("排序之前:\n" + Arrays.toString(data));
mergeSort(data);
System.out.println("排序之后:\n" + Arrays.toString(data));
}
}
分享到:
相关推荐
归并排序(Merge Sort)是一种高效的排序算法,其主要基于分治法(Divide and Conquer)的思想。在C++中实现归并排序,我们需要理解以下几个关键知识点: 1. **分治法**:分治法是计算机科学中常用的一种算法设计...
在这个例子中,`mergeSort()`函数实现了归并排序,通过递归地将序列一分为二,直到每个子序列只剩下一个元素,然后调用`merge()`函数进行合并操作。归并排序的优点是稳定性,即相等的元素在排序后的相对位置不会改变...
归并排序(Merge Sort)是一种基于分治策略的高效排序算法。它的基本思想是将待排序的元素序列分成两个或更多的子序列,分别对每个子序列进行排序,然后将排好序的子序列合并成一个有序序列。这个过程可以递归进行,...
这个例子展示了如何在C++中实现归并排序的基本框架,包括递归分解和合并操作。在实际编程中,可以根据具体需求进行调整,例如优化内存管理或处理不同类型的数据结构。 总之,归并排序是一种高效稳定的排序算法,...
归并排序是一种基于分治策略的高效排序算法,它的核心思想是将大问题分解为小问题来解决。在归并排序中,我们将一个大数组分为两个或更多个较小的子数组,对每个子数组进行排序,然后将这些有序的子数组合并成一个大...
归并排序(Merge Sort)是一种基于分治策略的高效排序算法。它的主要思想是将待排序的序列分成两部分,分别进行排序,然后再合并这两部分,以得到完整的有序序列。这个过程可以递归地应用于每一部分,直到每个部分只...
归并排序是一种常用的排序算法,它的时间复杂度为O(nlogn)。归并排序的基本思想是将数组分成两个部分,然后将这两个部分分别排序,最后将两个排序好的部分合并成一个有序的数组。 堆排序是一种常用的排序算法,它的...
归并排序(Merge Sort)是一种基于分治策略的高效排序算法。在计算机科学中,它被广泛用于数据处理和管理,特别是在需要稳定性和高效率的排序场景。C#作为一种面向对象的编程语言,提供了丰富的工具和库来实现各种...
在这个例子中,我们首先定义了一个 `merge_sort` 函数来执行归并排序的主要流程,它通过递归调用自身来分解数组,直到每个子数组只包含一个元素。接着,定义了 `merge` 函数来合并两个已排序的子数组。最后,我们...
在这个SCAU-8645归并排序的例子中,我们看到了一个完整的C++实现。 首先,我们从代码的`#include`部分可以看到,这个程序使用了C++的标准库,包括`iostream`(输入输出)、`cstring`(字符串操作)、`algorithm`...
在算法设计与分析课程中,归并排序是一个典型的例子,用来讲解分治法和递归的思想。通过分析归并排序,学生能够理解和掌握如何将复杂问题分解成更小的子问题,以及如何通过合并子问题的解来得到原问题的解。此外,...
归并排序是一种高效的排序算法,基于分治策略。它的核心思想是将大问题分解为小问题,然后逐一解决,最后将结果合并。在归并排序中,这个过程体现在将一个大数组不断分为两个子数组,直到每个子数组只有一个元素,...
归并排序是一种高效的排序算法,属于分治策略的典型应用,其主要思想是将大问题分解为小问题来解决,最终再将小问题的结果合并,从而得到整个大问题的解。该算法的时间复杂度在所有情况下都能保持为O(nlogn),这得益...
- 文档中提到的编程练习涉及各种基于排序的问题,如成绩排序、奖学金分配等,这些都是理解和运用归并排序的好例子。实际编程中,需要根据具体问题的特点,选择合适的排序算法。 总结,归并排序是一种高效的排序...
归并排序是一种经典的排序算法,基于“分治”策略。它的主要思想是将大问题分解成小问题,然后逐个解决这些小问题,最后再将解决好的小问题合并成最终的解决方案。在归并排序中,我们将一个无序的序列分割成若干个...
在这个例子中,代码使用了`timsort`的思路,这是一种自适应的排序算法,结合了插入排序和归并排序的优点,能够处理部分有序的数据,性能上优于纯归并排序。但是,代码中并没有具体体现`timsort`的全部特性,例如它的...
这个例子展示了归并排序的过程,每次合并后数组的排序状态。首先,数组被分为两半并进行合并,然后继续对每个半边进行相同的处理,直到整个数组有序。 总的来说,非递归归并排序的关键在于设计合适的循环结构来模拟...
在这个例子中,`ToMergeSort()` 方法可能实现了非递归归并排序。 3. **自然归并排序**: 自然归并排序是一种优化过的归并排序,主要应用于数据已经部分有序的情况。它不是简单地将数组一分为二,而是尝试找到数组...
归并排序是一种基于分治策略的高效排序算法,它的核心思想是将待排序的数据分成较小的子序列,分别对这些子序列进行排序,然后将排序好的子序列合并成一个大的有序序列。在Java中,我们可以使用递归的方式来实现归并...
归并排序是一种高效的排序算法,基于分治策略。在C语言中实现归并排序,我们需要理解算法的基本原理和步骤。 1. **算法原理**: 归并排序将待排序的序列分成两个子序列,分别对这两个子序列进行排序,然后将两个已...