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

算法导论——合并排序

阅读更多
合并排序采用了分治法的思路来设计排序算法。
主要步骤:
1:分解数组
2:排序子数组
3:合并排序好的子数组

其代码如下:
public interface Sort<T> {
	
	/**
	 * 返回排序后的数组
	 * @return
	 */
	public T[] sort(T[] array);
	
}


import java.util.Arrays;
import java.util.Comparator;

public abstract class AbstractSort<T> implements Sort<T> {
	
	
	/**
	 * 用于比较数组元素大小
	 */
	protected Comparator<? super T> comp;
	
	public void init(Comparator<? super T> comp){
		this.comp = comp;
	}
	
	public void print(T[] array){
		System.out.println(Arrays.toString(array));
	}
	
	public void swap(T[] array,int i ,int j){
		T temp = array[i];
		array[i] = array[j];
		array[j] = temp;
	}
	
}

import java.util.Arrays;
import java.util.Comparator;

public class MergeSort<T> extends AbstractSort<T> {

	public MergeSort(Comparator<? super T> comp) {
		init(comp);
	}

	@Override
	public T[] sort(T[] array) {
		sort(array, 0, array.length - 1, array.clone());
		return array;
	}

	/**
	 * 对指定区间[start,end]的数组元素进行排序
	 * 
	 * @param start
	 * @param end
	 */
	private void sort(T[] src, int start, int end, T[] clone) {
		if (start < end) {
			int mid = (end + start) / 2;
			sort(src, start, mid, clone);
			sort(src, mid + 1, end, clone);
			merge(src, start, mid + 1, end + 1, clone);
		}
	}

	/**
	 * 合并子数组[start,mid)和子数组[mid,end)。
	 * 
	 * @param src
	 * @param start
	 * @param mid
	 * @param end
	 * @param clone
	 */
	private void merge(T[] src, int start, int mid, int end, T[] clone) {
		System.arraycopy(src, start, clone, start, end - start);
		int leftIndex = start;
		int rightIndex = mid;
		int i = start;
		for (; leftIndex < mid && rightIndex < end; i++) {
			T l = clone[leftIndex];
			T r = clone[rightIndex];
			if (comp.compare(r, l) > 0) {
				src[i] = l;
				leftIndex++;
			} else {
				src[i] = r;
				rightIndex++;
			}
		}
		if (leftIndex < mid) {
			System.arraycopy(clone, leftIndex, src, i, mid - leftIndex);
		} else // if(rightIndex == end)
		{
			// 复制右半部分
			System.arraycopy(clone, rightIndex, src, i, end - rightIndex);
		}
	}

	public static void main(String[] args) {
		MergeSort<Integer> s = new MergeSort<Integer>(new Comparator<Integer>() {

			@Override
			public int compare(Integer o1, Integer o2) {
				return o1 - o2;
			}
		});
		Integer[] array = new Integer[] { 3, 5, 9, 8 };
		s.sort(array);
		System.out.println(Arrays.toString(array));
	}

	@Override
	public String toString() {
		return "合并排序";
	}

}

分享到:
评论

相关推荐

    MIT算法导论——算法顶尖经典教材

    《MIT算法导论》是计算机科学领域的一部权威著作,由世界知名学府麻省理工学院(MIT)的专家撰写,被广泛认为是学习算法的首选教材。这本书深入浅出地介绍了算法的设计、分析和实现,是入门者和进阶者提升算法能力的...

    中科大算法导论课程实验 常见排序算法的实现与性能比较 报告

    描述部分指明了实验的目的和范围,要求对六种排序算法——合并排序、插入排序、希尔排序、快速排序、冒泡排序、桶排序——进行实现并比较它们的性能。 #### 标签解读 标签“算法导论 排序算法”标明了该文档属于...

    算法导论课后习题2.3-7和思考题2-4答案源码

    首先,我们来看课后习题2.3-7——合并排序(Merge Sort)。合并排序是一种基于分治策略的排序算法,其基本思想是将大问题分解为小问题来解决。具体步骤包括: 1. 分解:将原始序列分割成两半,直到每个子序列仅包含...

    麻省理工学院-算法导论讲义

    《麻省理工学院-算法导论讲义》是一份深入探讨算法理论与实践的重要学习资料,源自世界顶级学府——麻省理工学院(MIT)。这份讲义涵盖了算法设计、分析和实现的关键概念,旨在帮助学生和专业人士理解如何高效地解决...

    算法导论课后经典习题答案

    例如,代码示例中展示的是归并排序算法的一个关键步骤——合并两个有序数组。在该函数`void Merge(int *A, int p, int q, int r)`中,首先创建了两个辅助数组`L`和`R`分别存储左右两部分的元素,然后通过比较两个...

    算法导论读书笔记

    《算法导论》是计算机科学领域的一本经典之作,它深入浅出地介绍了算法的设计、分析和实现。这本书的第二到第八章涵盖了诸多基础且重要的算法知识,是学习算法的基石。以下是对这些章节主要内容的详细解读: 第二章...

    算法导论(英文原版)

    - **2.1 插入排序**:介绍了一种简单的排序算法——插入排序,并通过实例演示其工作原理。 - **2.2 分析算法**:讲解了评估算法效率的方法,包括时间复杂度和空间复杂度的概念。 - **2.3 设计算法**:提供了几种...

    算法导论中文版答案详解

    这些题目进一步探讨了归并排序的核心思想,包括如何递归地分割数组、如何合并排序后的数组等。这些题目旨在帮助学生理解归并排序的时间复杂度以及空间复杂度。 #### 2.3-1 至 2.3-7 这部分题目主要关注算法分析中的...

    三份 <算法导论> 英文版答案

    提供的三份英文版答案文件——"算法导论第三版答案英文版.pdf"、"Instructor's Manual.pdf"和"solution.pdf"——将为学习者提供宝贵的参考资源,帮助他们更好地理解和掌握书中的概念和算法。 1. **算法设计与分析...

    算法导论算法导论答案

    根据提供的信息,《算法导论》是一本非常著名的计算机科学教材,涵盖了广泛的算法理论与实践应用。下面将基于题目中给出的章节及具体内容,提炼出重要的知识点,并进行详细解释。 ### 第2章:基本概念 #### 2.1 ...

    算法导论答案

    - 第4章讲述的是递归式和分治法,如4.1节的合并排序和4.2节的快速排序。 - 第5至第9章可能会讨论数据结构,如栈、队列、链表、树和图等。 - 第15至第16章可能关注动态规划和贪心算法。 - 第24至第25章可能与图...

    算法导论中文版答案

    综上所述,《算法导论》中文版涵盖了广泛的算法主题,从基本的数据结构和排序算法到高级的算法设计技术,如分治法、动态规划、概率分析和随机化算法等。通过系统学习这本书,读者不仅能掌握算法的基本原理和技巧,还...

    算法导论教师手册

    《算法导论教师手册》是针对《算法导论》第三版所配套的教学辅助资料。该手册由Thomas H. Cormen等多位作者共同编写,旨在为教师提供教学过程中所需的资源和支持。手册覆盖了从第二章至第二十六章的内容,提供了详细...

    [算法导论].[Introduction.to.Algorithms]文字版

    - **书名**:《算法导论》(第三版) - **作者**:Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, Clifford Stein - **出版社**:The MIT Press - **出版地点**:Cambridge, Massachusetts 和 London, ...

    算法导论答案(经典)

    从给定的文件信息来看,这是一份关于《算法导论》一书的参考答案集,涵盖了多个章节的问题解答。《算法导论》是计算机科学领域内的一本经典教材,由Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest和...

    《算法导论》第三版 英文版

    ### 《算法导论》第三版 英文版——核心知识点概述 #### 一、书籍基本信息 《算法导论》(第三版)是一本由Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest和Clifford Stein四位作者共同编写的经典...

    算法导论习题答案

    根据提供的信息,《算法导论习题答案》涵盖了多个章节的问题解答与分析,下面将针对给定的部分内容进行详细的解析,并从中提炼出相关的知识点。 ### 一、第二章 #### 2.1-1 至 2.1-4 这部分题目主要考察的是**合并...

    算法导论Introduction.to.Algorithms

    《算法导论》是由Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest和Clifford Stein共同编著的一部关于计算机算法的权威教材,此书目前的版本是第三版。本书由麻省理工学院出版社出版,被广泛应用于计算机...

Global site tag (gtag.js) - Google Analytics