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

java归并算法实现

阅读更多

教材是MIT的OCW课程Introduction to Algorithms;其中的归并算法实现

绪:最近在学习算法设计,教材是MIT的OCW课程Introduction to Algorithms;其中的归并算法实现,花费了我大半天时间,最后才成功搞定.为了避免初学者少走弯路,特拿来与大家共享!

归并排序算法思想:

分而治之(divide - conquer);每个递归过程涉及三个步骤

第一, 分解: 把待排序的 n 个元素的序列分解成两个子序列, 每个子序列包括 n/2 个元素.

第二, 治理: 对每个子序列分别调用归并排序MergeSort, 进行递归操作 .

第三, 合并: 合并两个排好序的子序列,生成排序结果.

教材上的伪码描述:

MERGE(A, p, q, r)
1 n1 ← q - p + 1//修改为 n1 ← q - p
2 n2 ← r - q //修改 n2 ← r - q + 1
3 create arrays L[1 ‥ n1 + 1] and R[1 ‥ n2 + 1]
4 for i ← 1 to n1
5 do L[i] ← A[p + i - 1]
6 for j ← 1 to n2
7 do R[j] ← A[q + j]
8 L[n1 + 1] ← ∞
9 R[n2 + 1] ← ∞
10 i ← 1
11 j ← 1
12 for k ← p to r
13 do if L[i] ≤ R[j]
14 then A[k] ← L[i]
15 i ← i + 1
16 else A[k] ← R[j]
17 j ← j + 1
MERGE-SORT(A, p, r)
1 if p < r
2 then q ← (p + r)/2
3 MERGE-SORT(A, p, q)
4 MERGE-SORT(A, q + 1, r)
5 MERGE(A, p, q , r)//修改为MERGE(A, p, q + 1, r)


共有三个修改之处,按照教材中的描述结合Java数组下标从0开始的规定若修改为
MERGE(A, p, q, r)
1 n1 ← q - p + 1//修改为 n1 ← q - p
2 n2 ← r - q //修改 n2 ← r - q
MERGE-SORT(A, p, r)
4 MERGE-SORT(A, q + 1, r)
程序不能正常运行,暂时还不太清楚问题出在什么地方,怀疑和编译器对递归算法的实现有关.
按我所修改的方法,其具体实现代码如下:

package algorithm;
public class MergeSortAlgorithm {
final static int MAXVALUE = 10000;
static int[] L;
static int[] R;
public static void Merge(int[] A, int p, int q, int r) {
int n1 = q - p; //correct
int n2 = r - q + 1; //correct
//int n1 = q-p;
// int n2 = r - q;
L = new int[n1 + 1];
R = new int[n2 + 1];
for (int i = 0; i < n1; i++) {
L[i] = A[p + i];
}
for (int j = 0; j < n2; j++) {
R[j] = A[q + j];
}
L[n1] = MAXVALUE;
R[n2] = MAXVALUE;
int i = 0, j = 0;
for (int k = p; k <= r; k++) {
//for(int k = p; k < r ;k++)
{
if (L[i] <= R[j]) {
A[k] = L[i];
i++;
} else {
A[k] = R[j];
j++;
}
}
}
}
public static void MergeSort(int[] A, int p, int r) {
int q;
if (p < r) {
q = (p + r) / 2;
/*correctness*/
MergeSort(A, p, q);
MergeSort(A, q + 1, r);
Merge(A, p, q + 1, r);
/*test*/
/*
MergeSort(A,p,q);
MergeSort(A,q,r);
Merge(A,p,q,r);*/
}
}
public static void main(String[] args) {
int[] inputArray = {1, 3, 2, 6, 5, 2, 4, 7, 1, 3, 2, 6, 5, 2, 4, 7,
1, 3, 2, 6, 5, 2, 4, 7, 1, 3};
MergeSort(inputArray, 0, inputArray.length - 1);
for (int i = 0; i < inputArray.length; i++) {
System.out.println("intArray[" + i + "]=" + inputArray[i]);
}
}
}

分享到:
评论

相关推荐

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

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

    java实现归并排序

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

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

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

    java算法-二路归并

    Java作为一种广泛使用的编程语言,提供了丰富的工具和库来支持算法实现。本篇将详细探讨"二路归并排序"这一经典算法,并结合Java环境(如NetBeans)进行讲解。 二路归并排序(Two-Way Merge Sort)是基于分治策略的...

    Java排序算法之归并排序简单实现

    "Java排序算法之归并排序简单实现" Java排序算法中的归并排序是一种高效的排序算法,它的平均时间复杂度、最好时间复杂度和最坏时间复杂度均为O(nlogn),空间复杂度为O(n),是一种稳定的排序算法。下面是对归并...

    JAVA归并排序算法.pdf

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

    c语言与java 经典算法实现

    本资源"《C语言与Java 经典算法实现》"聚焦于这两门广泛使用的编程语言,通过它们来阐述和实现经典的算法。下面将详细讨论其中涉及的主要知识点。 首先,我们来关注排序算法。排序是计算机科学中最基础也是最重要的...

    归并算法的代码

    在提供的`Src`文件中,可能包含了使用特定编程语言(如Python、Java、C++等)实现的归并排序代码,新手可以通过阅读和理解这些代码来学习归并排序的工作原理和实现细节。 归并排序的时间复杂度是O(n log n),空间...

    归并分类算法、改进的归并分类算法和快速分类算法.zip

    文件名列表中提到的"QuickSort.java"可能包含了快速排序的实现代码,而其他未列出的文件可能包含了归并排序和改进归并排序的实现。通过分析这些代码,我们可以学习每种算法的实现细节,进一步提升我们的编程技能和...

    外排序之多路归并的java实现

    外排序--基于败者树的多路归并排序算法的java实现

    java 各类算法实现代码

    Java算法实现代码主要涵盖了许多计算机科学中的核心算法,这些算法是编程基础,也是解决复杂问题的关键工具。在Java中实现这些算法,可以帮助开发者更好地理解和应用它们。以下将详细阐述一些常见的Java算法及其重要...

    java实现归并排序算法

    mergeSort 方法实现了归并排序算法。它使用递归的方式将数组不断划分为更小的子数组,直到每个子数组只有一个元素,然后再依次将这些子数组进行合并,从而实现排序。 merge 方法用于合并两个有序子数组。它借助两个...

    java多种算法实现代码

    本资料"java多种算法实现代码"显然是一个集合,包含了用Java实现的各种算法示例,非常适合初学者和有经验的开发者进行学习和参考。 1. **排序算法**:排序是数据处理中的基本操作,常见的有冒泡排序、选择排序、...

    Java常用算法手册(jb51.net)_Java常用算法手册_

    在算法基础部分,书中会详细介绍如何用Java实现基本的逻辑控制结构,如循环、条件判断,以及基础的递归思想。递归是很多高级算法的基础,理解并熟练运用递归对于提升编程能力至关重要。 数据结构部分,书中可能会...

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

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

    JAVA 经典算法(也有C实现)

    Java和C语言都是广泛应用于算法实现的编程语言,它们具有高效性和灵活性。"JAVA 经典算法(也有C实现)"这个资源包含了一些在软件开发中常用的、经典的算法,旨在帮助开发者提升算法思维和程序设计能力。 首先,让...

    java归并外排序

    3. 合并:最后,使用归并算法将所有排序好的块合并成一个有序的大文件。归并过程中,我们逐个读取各块的顶部元素,比较它们的大小,选择最小的一个写入结果文件,并移除该元素。这个过程重复,直到所有块都处理完毕...

    java算法——归并排序

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

Global site tag (gtag.js) - Google Analytics