`
luckaway
  • 浏览: 137778 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

分治算法——归并排序的java实现

阅读更多
1.分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。
分治法解题的一般步骤:
(1)分解,将要解决的问题划分成若干规模较小的同类问题;
(2)求解,当子问题划分得足够小时,用较简单的方法解决;
(3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。

2.归并排序:是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。

MergerSorter.java


/**
 * 归并操作的实现类
 */

public class MergerSorter {

	private static final int[] ARRAY = {2, 5, 10, 30, 60, 40, 5, 6, 66};

	public int[] sort(int[] array) {
		if (array.length == 1)
			return array;
		final int dividePos = array.length / 2;
		int[] array1 = new int[dividePos];
		System.arraycopy(array, 0, array1, 0, array1.length);
		int[] array2 = new int[array.length - dividePos];
		System.arraycopy(array, dividePos, array2, 0, array2.length);
		return merge(sort(array1), sort(array2));
	}

	public int[] merge(int[] a1, int[] a2) {
		int[] result = new int[a1.length + a2.length];
		int cursor = 0;
		int cursor1 = 0;
		int cursor2 = 0;
		while (cursor1 < a1.length && cursor2 < a2.length) {
			if (a1[cursor1] > a2[cursor2]) {
				result[cursor++] = a2[cursor2++];
			} else {
				result[cursor++] = a1[cursor1++];
			}
		}

		while (cursor1 < a1.length) {
			result[cursor++] = a1[cursor1++];
		}

		while (cursor2 < a2.length) {
			result[cursor++] = a2[cursor2++];
		}

		return result;
	}

	public static void main(String args[]) {
		int[] r = new MergerSorter().sort(ARRAY);
		for (int t : r) {
			System.out.print(t + ",");
		}
	}
}



MergerSorterTest.java
import static org.junit.Assert.assertArrayEquals;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;

/**
 * TestCase of MergerSorter
 */

public class MergerSorterTest {

	private MergerSorter mergerSorter = null;

	@Before
	public void setUp() throws Exception {
		mergerSorter = new MergerSorter();
	}

	@After
	public void tearDown() throws Exception {
		mergerSorter = null;
	}

	@Test
	public void merge() {
		int[] a1 = {2, 6, 8, 9};
		int[] a2 = {5, 8, 10, 12};
		int[] expected = {2, 5, 6, 8, 8, 9, 10, 12};
		assertArrayEquals(expected, mergerSorter.merge(a1, a2));
	}

	@Test
	public void sort() {
		int[] srcArray = {9, 12, 6, 10, 8, 2, 8, 5};
		int[] expected = {2, 5, 6, 8, 8, 9, 10, 12};

		assertArrayEquals(expected, mergerSorter.sort(srcArray));
	}
}

分享到:
评论
2 楼 luckaway 2009-10-11  
ivyloo 写道
分治并没要求小的部分和原问题性质相同,你把分治思想和递归搞混了!

呵呵,这倒没仔细考虑,这里的重点是归并排序的实现。
1 楼 ivyloo 2009-10-10  
分治并没要求小的部分和原问题性质相同,你把分治思想和递归搞混了!

相关推荐

    算法-归并排序(java)(csdn)————程序.pdf

    归并排序(Merge Sort)是一种常用的排序算法,属于分治算法的范畴。下面将详细介绍归并排序算法的java实现。 什么是归并排序? 归并排序是一种基于分治策略的排序算法。其基本思想是将一个大的无序数组分成两个或...

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

    根据给定的文件信息,我们将深入探讨两种经典的排序算法——快速排序和归并排序,并结合Java语言实现进行详细解析。 ### 快速排序算法 快速排序是一种高效的排序算法,采用分而治之的策略,其核心思想是选择一个...

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

    这篇实验报告将深入探讨两种经典的排序算法——快速排序和归并排序,通过对它们在Java环境中的实现和性能测试,揭示它们在处理不同规模数据时的效率差异。 **快速排序(Quick Sort)** 快速排序由C.A.R. Hoare在...

    《Java数据结构和算法》学习笔记(5)——递归 归并排序

    在本篇《Java数据结构和算法》学习笔记中,我们将深入探讨递归和归并排序。递归是一种强大的编程技术,常用于解决复杂问题,而归并排序则是利用递归实现的一种高效排序算法。 首先,让我们理解什么是递归。递归是...

    十种常用算法之分治算法(java版)(csdn)————程序.pdf

    例如,快速排序、归并排序、大整数乘法、最近点对查找等问题都可以用分治算法来解决。它能够简化问题的复杂性,提高算法的效率,尤其是在数据量大的情况下。 4. 注意事项 - 分治算法的效率取决于问题的分解方式...

    各种排序算法java实现

    标题 "各种排序算法java实现" 涉及到的是计算机科学中的一个重要领域——算法,特别是排序算法在Java编程语言中的具体应用。排序算法是数据结构与算法分析中的基础部分,它们用于将一组数据按照特定顺序排列。在这个...

    常用排序算法小结(附Java实现)

    Hoare提出的快速排序是一种分治算法,通过选取一个“基准”元素,将数组分为两部分,一部分的所有元素都小于基准,另一部分所有元素都大于基准,然后递归地对这两部分进行排序。平均时间复杂度为O(n log n),但在最...

    数据结构与算法答案——java语言描述

    本资料集是“数据结构与算法答案——java语言描述”,虽然全为英文内容,但其深入探讨了使用Java实现数据结构和算法的细节。 1. **数组**:数组是最基本的数据结构之一,它是一系列相同类型元素的集合,可以通过索...

    排序算法_java

    本文将深入探讨标题和描述中提及的五种经典排序算法——插入排序、归并排序、选择排序、冒泡排序和希尔排序,以及它们在Java中的实现。 1. 插入排序(Insertion Sort) 插入排序是一种简单直观的排序算法,它的工作...

    <<数据结构>> 内部排序的java实现

    在提供的博客链接中,作者可能详细解释了这些内部排序算法的Java实现,并可能探讨了它们的性能分析、优化技巧以及适用场景。通过阅读这篇博客,读者可以深入理解内部排序算法的核心思想,提升自己的编程技能和算法...

    数据结构与算法分析——Java语言描述

    通过Java实现数据结构和算法,可以更好地理解面向对象编程的思想,并利用其优势提高代码的可读性和可维护性。 此外,书中可能还包含了实际编程中的技巧和陷阱,如内存管理、异常处理和并发编程等。了解这些不仅能...

    排序算法 Java经典算法

    首先,我们来看看基础的排序算法——冒泡排序。冒泡排序是最简单的交换排序,通过重复遍历待排序的数列,依次比较相邻元素并根据需要交换它们的位置,直到没有任何一对数字需要交换为止。虽然效率较低,但它对于理解...

    各种排序Java代码

    以下将详细讲解标题“各种排序Java代码”中涉及的几种排序方法,包括快速排序、冒泡排序、堆排序和归并排序。 1. **快速排序(Quick Sort)**: 快速排序是一种基于分治思想的高效排序算法,由C.A.R. Hoare在1960...

    java实现各种排序算法及其速度对比(附详细代码)(csdn)————程序.pdf

    Java 提供了一个内置的排序方法 `Arrays.sort()`,它使用了TimSort算法,一种混合排序算法,结合了插入排序和归并排序的优点,对小规模数据和已部分排序的数据有很好的表现。在Java 8中,`Arrays.sort()`对于基本...

    各种算法的java实现

    7. **分治法**:将大问题分解为小问题解决,然后将结果合并,如归并排序、快速排序等算法都采用了这种策略。 8. **数据结构**:如链表、栈、队列、树、图、哈希表等,它们是算法的基石,理解和熟练使用这些数据结构...

    常用排序算法分析与实现(Java版)

    归并排序,利用了分治法,将大问题分解为小问题解决;堆排序,通过构建最大(或最小)堆来实现排序等。这些算法各有优缺点,适用于不同的场景,理解并熟练运用它们能极大地提高编程效率和解决问题的能力。 在实际...

    java面试java排序算法

    归并排序是一种分治策略,其基本思想是将大问题分解为小问题来解决。具体步骤如下: 1. **分割**:将原始序列分成两个相等或近似的子序列。 2. **递归排序**:对每个子序列独立进行归并排序。 3. **合并**:将两个...

Global site tag (gtag.js) - Google Analytics