`

Java 归并排序(基于数组)

阅读更多

    归并排序:归并算法的中心是归并两个已经有序的数组,并且递归调用归并操作。
    优点和缺点:比简单排序在速度上快很多;归并排序会占用双倍的存储空间。
    效率:归并排序的时间复杂度是 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]

 

分享到:
评论
1 楼 liuyuanhui0301 2013-04-07  
    aka~

相关推荐

    Java数组+数组排序+数组复制+最大最小值+合并数组+数组升降序排序+数组查找

    Java数组排序:冒泡排序、选择排序 、插入排序 、快速排序、希尔排序、堆排序和归并排序 三种Java数组复制方法 Java数组最大最小值 四种合并Java数组方法 Java数组升降序排序 Java数组查找:二分查找、顺序查找、...

    JavaSwing归并排序动画源码(含其他排序)

    在这个场景中,我们讨论的焦点是使用 Java Swing 来实现一个排序算法的动画展示,特别是归并排序。归并排序是一种高效的、稳定的排序算法,它的基本思想是将大问题分解为小问题来解决,通过递归地将两个或更多有序数...

    java实现归并排序

    Java 实现归并排序是一种常用的排序算法,通过分治策略将原始数组分成小组,然后对每个小组进行排序,最后将排序好的小组合并成一个有序数组。下面是 Java 实现归并排序的知识点总结: 基本思想 归并排序的基本...

    java数组排序

    归并排序是一种分治策略的排序算法,它将数组分为两半,分别对每一半进行排序,然后将两个有序的部分合并。在Java中,归并排序可以使用递归实现: ```java public class MergeSort { public static void sort(int...

    归并排序Java_归并排序_

    归并排序是一种高效的排序算法,基于分治策略。在Java中实现归并排序,我们可以创建一个名为`MergeSort`的类来封装整个过程。归并排序的基本思想是将待排序的序列分成两个或更多的子序列,对每个子序列分别进行排序...

    归并排序(JAVA)

    归并排序是一种经典的排序算法,基于分治策略。在Java中实现归并排序,我们可以将一个大数组分成两个小数组,分别对它们进行排序,然后将排序后的子数组合并成一个有序的大数组。这个过程会递归地进行,直到每个子...

    java代码-java 归并排序(偶数 子数组已排序)

    归并排序是一种经典的排序算法,基于分治策略。在Java编程中,归并排序通过将大问题分解为小问题来解决,然后将结果合并以得到最终解决方案。这种算法的时间复杂度为O(n log n),在处理大数据集时表现稳定且效率高。...

    Java实现归并排序

    归并排序(Merge Sort)是一种基于分治策略的高效排序算法。它的基本思想是将待排序的元素序列分成两个或更多的子序列,分别对每个子序列进行排序,然后将排好序的子序列合并成一个有序序列。这个过程可以递归进行,...

    [算法]快速排序,归并排序,堆排序的数组和单链表实现 (1) 数组和链表.pdf

    归并排序是一种基于比较的排序算法,它的时间复杂度为O(nlogn)。归并排序的基本思想是将数组分割成两个部分,然后对这两个部分进行排序,最后将两个排序好的部分合并成一个排序好的数组。 堆排序 堆排序是一种基于...

    java 将二维数组顺时针,逆时针排序

    - 首先,我们可以将二维数组的元素转换成一维数组,然后使用标准的排序算法(如快速排序、归并排序)对一维数组进行排序。 - 排序完成后,根据原二维数组的行数和列数,再将一维数组重新构造回二维数组,此时元素...

    java归并排序

    Java中的归并排序提供了递归和非递归两种实现方式,它们都基于分治策略,通过不断划分和合并操作达到排序目的。虽然非递归版在空间上可能更为节省,但递归版通常更易于理解和实现。在实际应用中,开发者应根据具体...

    java 部分数组递增排序

    2. **选择排序算法**:有许多排序算法可供选择,如冒泡排序、插入排序、选择排序、快速排序、归并排序等。对于小规模的数据或部分排序,简单排序算法如插入排序可能就足够了。对于大规模数据,效率更高的算法如快速...

    JAVA归并排序算法.pdf

    整个Java归并排序的实现中,还考虑了内存分配的问题,通过`malloc`函数动态分配内存给临时数组`R1`,并在排序完成后释放内存,保证了算法的健壮性。 文档内容虽然由于OCR扫描存在一定的识别错误,但通过上下文依然...

    Java ArrayList实现的快排,归并排序,堆排序

    归并排序同样采用分治策略,它将数组分成两半,分别排序后再合并。这个过程可以递归进行,直到每个子数组只包含一个元素,然后再逐步合并。在ArrayList中,我们需要创建额外的存储空间来辅助排序,因为归并排序不是...

    java 冒泡排序 数组冒泡排序

    冒泡排序是一种基础且经典的排序算法,它通过不断交换相邻两个元素的位置,使得每一次遍历都能将当前未排序...在实际开发中,对于大规模数据的排序,我们通常会选择更高效的排序算法,如快速排序、归并排序或堆排序。

    归并排序单步演示软件

    这个“归并排序单步演示软件”特别适合Java学习者,因为Java是实现归并排序的常见编程语言。在Java中,可以使用内置的数据结构如ArrayList或者数组来存储和操作数据,同时利用递归函数实现算法逻辑。 标签中的...

    插入排序和归并排序的实现java

    这里我们将深入探讨两种常见的排序算法:插入排序(Insertion Sort)和归并排序(Merge Sort),它们都是在Java环境下实现的。 **插入排序**是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序...

    数组以及排序算法

    平均时间复杂度为O(n^2),最好情况(已排序数组)为O(n)。 3. 选择排序:每次找出未排序部分的最小(或最大)元素,与未排序部分的第一个元素交换。时间复杂度为O(n^2)。 4. 快速排序:利用分治策略,选取一个基准...

    详解Java常用排序算法-归并排序

    Java常用排序算法-归并排序 归并排序是一种分治思想的排序算法,其基本思想是将待排序的数组分成若干个子序列,每个子序列都是有序的,然后再将子序列合并成一个有序的数组。这种算法的时间复杂度为O(n log n),...

    可视化归并排序

    本项目使用了Java编程语言,结合了归并排序算法和Swing库来创建一个可运行的程序,让用户能够观察到数据如何在排序过程中被逐步整合。 归并排序是一种分治策略的典型应用。它将一个大问题分解成小问题,然后分别...

Global site tag (gtag.js) - Google Analytics