`

Java 归并排序算法

阅读更多
/**
 * 
 * 改进后的归并排序:
 * 
 */
public class ImprovedMergeSort {

	private static final int THRESHOLD = 10;

	public void sort(int[] data) {
		int[] temp = new int[data.length];
		mergeSort(data, temp, 0, data.length - 1);
	}

	private void mergeSort(int[] data, int[] temp, int l, int r) {
		int i, j, k;
		int mid = (l + r) / 2;
		if (l == r)
			return;
		if ((mid - l) >= THRESHOLD)
			mergeSort(data, temp, l, mid);
		else
			insertSort(data, l, mid - l + 1);
		if ((r - mid) > THRESHOLD)
			mergeSort(data, temp, mid + 1, r);
		else
			insertSort(data, mid + 1, r - mid);

		for (i = l; i <= mid; i++) {
			temp[i] = data[i];
		}
		for (j = 1; j <= r - mid; j++) {
			temp[r - j + 1] = data[j + mid];
		}
		int a = temp[l];
		int b = temp[r];
		for (i = l, j = r, k = l; k <= r; k++) {
			if (a < b) {
				data[k] = temp[i++];
				a = temp[i];
			} else {
				data[k] = temp[j--];
				b = temp[j];
			}
		}
	}

	/**
	 * @param data
	 * @param start
	 * @param len
	 */
	private void insertSort(int[] data, int start, int len) {
		for (int i = start + 1; i < start + len; i++) {
			for (int j = i; (j > start) && data[j] < data[j - 1]; j--) {
				swap(data, j, j - 1);
			}
		}
	}

	private void swap(int[] data, int i, int j) {
		int temp = data[i];
		data[i] = data[j];
		data[j] = temp;
	}

}


/**
 * 归并排序:
 * 
 */
public class MergeSort{

	public void sort(int[] data) {
		int[] temp = new int[data.length];
		mergeSort(data, temp, 0, data.length - 1);
	}

	private void mergeSort(int[] data, int[] temp, int l, int r) {
		int mid = (l + r) / 2;
		if (l == r)
			return;
		mergeSort(data, temp, l, mid);
		mergeSort(data, temp, mid + 1, r);
		for (int i = l; i <= r; i++) {
			temp[i] = data[i];
		}
		int i1 = l;
		int i2 = mid + 1;
		for (int cur = l; cur <= r; cur++) {
			if (i1 == mid + 1)
				data[cur] = temp[i2++];
			else if (i2 > r)
				data[cur] = temp[i1++];
			else if (temp[i1] < temp[i2])
				data[cur] = temp[i1++];
			else
				data[cur] = temp[i2++];
		}
	}
}

分享到:
评论

相关推荐

    如何使用Java实现归并排序算法,程序详细解读

    归并排序:如何使用Java实现归并排序算法,程序详细解读; 归并排序:如何使用Java实现归并排序算法,程序详细解读; 归并排序:如何使用Java实现归并排序算法,程序详细解读; 归并排序:如何使用Java实现归并排序...

    JAVA归并排序算法.pdf

    JAVA 归并排序算法 JAVA 归并排序算法是利用 "归并 "技术来进行排序的。归并是指将若干个已排序的子文件合并成一个有序的文件。该算法有两种实现方法:自底向上和自顶向下。 自底向上的方法 自底向上的基本思想是...

    java实现归并排序

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

    Java 归并排序算法、堆排序算法实例详解

    Java 归并排序算法和堆排序算法实例详解 Java 归并排序算法是将两个或两个以上有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。 基本...

    归并排序Java_归并排序_

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

    归并排序(JAVA)

    以下是对归并排序算法的详细解释: 1. **分治策略**:归并排序的核心思想是分治法,即将复杂问题分解为较小的、易于解决的子问题。在这个过程中,我们将一个大数组分割成两个或多个相等(或接近相等)的部分,然后...

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

    在上面的代码中,`mergeSort`函数接受一个整数数组、一个左索引和一个右索引作为输入,并使用归并排序算法对指定范围内的数组元素进行排序。该函数使用递归将数组分成两个子数组,然后再将子数组合并成一个有序的...

    快速排序与归并排序的算法比较实验报告

    **快速排序与归并排序算法比较实验报告** 在计算机科学中,排序算法是处理大量数据时不可或缺的一部分。这篇实验报告将深入探讨两种经典的排序算法——快速排序和归并排序,通过对它们在Java环境中的实现和性能测试...

    Java实现归并排序

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

    java归并排序

    归并排序的核心是分治法,它将一个大数组分为两个相等或接近相等的子数组,分别对这两个子数组进行排序,然后将排序后的子数组合并成一个有序的大数组。这个过程不断递归进行,直到每个子数组只有一个元素,此时子...

    Java实现归并排序算法(源代码)

    ### Java实现归并排序算法(源代码)知识点详解 #### 一、归并排序概述 归并排序是一种经典的排序算法,其核心思想是分而治之。它将一个大问题分解为若干个相同的小问题来解决,最终通过合并这些小问题的解来得到...

    java算法——归并排序

    归并排序 在排序前,先建好一个长度等于原数组长度的临时数组

    java归并外排序

    归并排序是一种稳定的排序算法,它通过将两个已排序的序列合并为一个有序序列。在归并外排序中,每个块视为一个已排序的序列,而合并操作则是在多个块之间进行。 Java实现归并外排序时,通常会用到以下几个关键类和...

    给定一个数列,用归并排序算法把它排成升序。

    ### 归并排序算法知识点详解 #### 一、归并排序基本概念 归并排序是一种典型的分治策略算法,其核心思想是将待排序的数据序列分成若干子序列,然后对这些子序列进行排序,最后再合并成有序序列。归并排序的时间...

    归并排序算法链表实现

    归并排序的链表实现 随机生成实验数据,可以统计算法运行时间

    浅析java 归并排序算法

    Java 归并排序算法是一种基于分治思想的高效排序算法,它的主要特点是稳定且具有较高的时间复杂度效率。归并排序的基本操作包括将大问题分解为小问题,然后逐个解决小问题,最后将解决好的小问题合并为解决大的问题...

    快速排序算法以及归并算法

    ### 归并排序算法 归并排序是一种稳定的排序算法,同样基于分治法。它将数组分成两半,递归地排序每一半,然后将两个已排序的半数组合并成一个有序数组。 #### Java 实现代码分析 `Project17_Merge` 类展示了归并...

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

    - 实现归并排序算法,但每次交换元素时,都要更新图形组件的状态并触发重绘,以显示动画效果。可以使用`javax.swing.Timer`来控制动画的帧率,使得排序过程平滑进行。 - 在动画过程中,可以添加暂停、继续、重置等...

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

    本篇将重点讲解如何利用ArrayList实现快速排序(Quick Sort)、归并排序(Merge Sort)和堆排序(Heap Sort)这三种经典的排序算法,并探讨它们的原理、优缺点以及在实际应用中的选择。 **快速排序(Quick Sort)**...

Global site tag (gtag.js) - Google Analytics