合并排序采用了分治法的思路来设计排序算法。
主要步骤:
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)的专家撰写,被广泛认为是学习算法的首选教材。这本书深入浅出地介绍了算法的设计、分析和实现,是入门者和进阶者提升算法能力的...
描述部分指明了实验的目的和范围,要求对六种排序算法——合并排序、插入排序、希尔排序、快速排序、冒泡排序、桶排序——进行实现并比较它们的性能。 #### 标签解读 标签“算法导论 排序算法”标明了该文档属于...
首先,我们来看课后习题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等多位作者共同编写,旨在为教师提供教学过程中所需的资源和支持。手册覆盖了从第二章至第二十六章的内容,提供了详细...
- **书名**:《算法导论》(第三版) - **作者**: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 这部分题目主要考察的是**合并...
《算法导论》是由Thomas H. Cormen、Charles E. Leiserson、Ronald L. Rivest和Clifford Stein共同编著的一部关于计算机算法的权威教材,此书目前的版本是第三版。本书由麻省理工学院出版社出版,被广泛应用于计算机...