归并排序:归并算法的中心是归并两个已经有序的数组,并且递归调用归并操作。
优点和缺点:比简单排序在速度上快很多;归并排序会占用双倍的存储空间。
效率:归并排序的时间复杂度是 O(N*LogN);简单排序的复杂度是O(N2)。
每一趟归并的时间复杂度为 O(n), 需要O(logn)次归并
class MergerSort {
// 归并排序算法
public void mergeSort(int[] list, int length) {
int[] temp = new int[length];//临时数组
recMergeSort(list, temp, 0, length - 1); }
// 递归分割数据到基本单位
private void recMergeSort(int[] list, int[] temp, int low, int upper) {
if (low == upper) {
return;
} else {
int mid = (low + upper) / 2;
recMergeSort(list, temp, low, mid);
recMergeSort(list, temp, mid + 1, upper);
merge(list, temp, low, mid + 1, upper);
}
}
// 归并操作将基本单位归并成整个有序的数组
private void merge(int[] list, int[] temp, int left, int right, int last) {
int j = 0;
int lowIndex = left;
int mid = right - 1;
int n = last - lowIndex + 1;
while (left <= mid && right <= last) {
if (list[left] < list[right]) {
temp[j++] = list[left++];
} else {
temp[j++] = list[right++];
}
}
while (left <= mid) {
temp[j++] = list[left++];
}
while (right <= last) {
temp[j++] = list[right++];
}
for (j = 0; j < n; j++) {
list[lowIndex + j] = temp[j];
}
}
public static void main(String[] args) {
int arr[] = { 2, 568, 34, 46, 9, 23, 89, 43, 572, 684, 783, 543 };
MergerSort merger = new MergerSort();
merger.mergeSort(arr, 12);
for (int i = 0; i < 12; i++) {
System.out.print(arr[i] + ",");
}
}
}
如图所示:
[3 1 4 1 5 9 2 7]
/ \
[3 1 4 1] [5 9 2 7]
/ \ / \
[3 1] [4 1] [5 9] [2 7]
/ \ / \ / \ / \
[3] [1] [4] [1] [5] [9] [2] [7]
\ / \ / \ / \ /
[1 3] [1 4] [5 9] [2 7]
\ / \ /
[1 1 3 4] [2 5 7 9]
\ /
[1 1 2 3 4 5 7 9]
分享到:
相关推荐
Java数组排序:冒泡排序、选择排序 、插入排序 、快速排序、希尔排序、堆排序和归并排序 三种Java数组复制方法 Java数组最大最小值 四种合并Java数组方法 Java数组升降序排序 Java数组查找:二分查找、顺序查找、...
在这个场景中,我们讨论的焦点是使用 Java Swing 来实现一个排序算法的动画展示,特别是归并排序。归并排序是一种高效的、稳定的排序算法,它的基本思想是将大问题分解为小问题来解决,通过递归地将两个或更多有序数...
Java 实现归并排序是一种常用的排序算法,通过分治策略将原始数组分成小组,然后对每个小组进行排序,最后将排序好的小组合并成一个有序数组。下面是 Java 实现归并排序的知识点总结: 基本思想 归并排序的基本...
归并排序是一种分治策略的排序算法,它将数组分为两半,分别对每一半进行排序,然后将两个有序的部分合并。在Java中,归并排序可以使用递归实现: ```java public class MergeSort { public static void sort(int...
归并排序是一种高效的排序算法,基于分治策略。在Java中实现归并排序,我们可以创建一个名为`MergeSort`的类来封装整个过程。归并排序的基本思想是将待排序的序列分成两个或更多的子序列,对每个子序列分别进行排序...
归并排序是一种经典的排序算法,基于分治策略。在Java中实现归并排序,我们可以将一个大数组分成两个小数组,分别对它们进行排序,然后将排序后的子数组合并成一个有序的大数组。这个过程会递归地进行,直到每个子...
- 首先,我们可以将二维数组的元素转换成一维数组,然后使用标准的排序算法(如快速排序、归并排序)对一维数组进行排序。 - 排序完成后,根据原二维数组的行数和列数,再将一维数组重新构造回二维数组,此时元素...
归并排序是一种经典的排序算法,基于分治策略。在Java编程中,归并排序通过将大问题分解为小问题来解决,然后将结果合并以得到最终解决方案。这种算法的时间复杂度为O(n log n),在处理大数据集时表现稳定且效率高。...
归并排序(Merge Sort)是一种基于分治策略的高效排序算法。它的基本思想是将待排序的元素序列分成两个或更多的子序列,分别对每个子序列进行排序,然后将排好序的子序列合并成一个有序序列。这个过程可以递归进行,...
归并排序是一种基于比较的排序算法,它的时间复杂度为O(nlogn)。归并排序的基本思想是将数组分割成两个部分,然后对这两个部分进行排序,最后将两个排序好的部分合并成一个排序好的数组。 堆排序 堆排序是一种基于...
Java中的归并排序提供了递归和非递归两种实现方式,它们都基于分治策略,通过不断划分和合并操作达到排序目的。虽然非递归版在空间上可能更为节省,但递归版通常更易于理解和实现。在实际应用中,开发者应根据具体...
2. **选择排序算法**:有许多排序算法可供选择,如冒泡排序、插入排序、选择排序、快速排序、归并排序等。对于小规模的数据或部分排序,简单排序算法如插入排序可能就足够了。对于大规模数据,效率更高的算法如快速...
整个Java归并排序的实现中,还考虑了内存分配的问题,通过`malloc`函数动态分配内存给临时数组`R1`,并在排序完成后释放内存,保证了算法的健壮性。 文档内容虽然由于OCR扫描存在一定的识别错误,但通过上下文依然...
归并排序同样采用分治策略,它将数组分成两半,分别排序后再合并。这个过程可以递归进行,直到每个子数组只包含一个元素,然后再逐步合并。在ArrayList中,我们需要创建额外的存储空间来辅助排序,因为归并排序不是...
冒泡排序是一种基础且经典的排序算法,它通过不断交换相邻两个元素的位置,使得每一次遍历都能将当前未排序...在实际开发中,对于大规模数据的排序,我们通常会选择更高效的排序算法,如快速排序、归并排序或堆排序。
这个“归并排序单步演示软件”特别适合Java学习者,因为Java是实现归并排序的常见编程语言。在Java中,可以使用内置的数据结构如ArrayList或者数组来存储和操作数据,同时利用递归函数实现算法逻辑。 标签中的...
这里我们将深入探讨两种常见的排序算法:插入排序(Insertion Sort)和归并排序(Merge Sort),它们都是在Java环境下实现的。 **插入排序**是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序...
平均时间复杂度为O(n^2),最好情况(已排序数组)为O(n)。 3. 选择排序:每次找出未排序部分的最小(或最大)元素,与未排序部分的第一个元素交换。时间复杂度为O(n^2)。 4. 快速排序:利用分治策略,选取一个基准...
Java常用排序算法-归并排序 归并排序是一种分治思想的排序算法,其基本思想是将待排序的数组分成若干个子序列,每个子序列都是有序的,然后再将子序列合并成一个有序的数组。这种算法的时间复杂度为O(n log n),...
本项目使用了Java编程语言,结合了归并排序算法和Swing库来创建一个可运行的程序,让用户能够观察到数据如何在排序过程中被逐步整合。 归并排序是一种分治策略的典型应用。它将一个大问题分解成小问题,然后分别...