`

归并算法

阅读更多
import java.util.Arrays;   
  
/**  
 * java归并算法实现<br>  
 *   
 * @author JAVA世纪网(java2000.net, laozizhu.com)  
 */  
public class Test {   
  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;   
    int n2 = r - q + 1;   
    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++) {   
      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;   
      MergeSort(A, p, q);   
      MergeSort(A, q + 1, r);   
      Merge(A, p, q + 1, 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 };   
    // 方法1   
    MergeSort(inputArray, 0, inputArray.length - 1);   
    System.out.println(Arrays.toString(inputArray));   
    Integer[] inputArray2 = { 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 };   
    // 方法2   
    new MergeSort().sort(inputArray2);   
    System.out.println(Arrays.toString(inputArray2));   
  }   
}   
  
class MergeSort {   
  private Comparable[] bridge;   
  
  /**  
   * *利用归并排序算法对数组obj进行排序  
   */  
  public void sort(Comparable[] obj) {   
    if (obj == null) {   
      throw new NullPointerException("The param can not be null!");   
    }   
    bridge = new Comparable[obj.length];// 初始化中间数组   
    mergeSort(obj, 0, obj.length - 1); // 归并排序   
    bridge = null;   
  }   
  
  /**  
   * 将下标从left到right的数组进行归并排序  
   *   
   * @param obj 要排序的数组的句柄  
   * @param left 要排序的数组的第一个元素下标  
   * @param right 要排序的数组的最后一个元素的下标  
   */  
  private void mergeSort(Comparable[] obj, int left, int right) {   
    if (left < right) {   
      int center = (left + right) / 2;   
      mergeSort(obj, left, center);   
      mergeSort(obj, center + 1, right);   
      merge(obj, left, center, right);   
    }   
  }   
  
  /**  
   * *将两个对象数组进行归并,并使归并后为升序。归并前两个数组分别有序  
   *   
   * @param obj 对象数组的句柄  
   * @param left 左数组的第一个元素的下标  
   * @param center 左数组的最后一个元素的下标  
   * @param right 右数组的最后一个元素的下标  
   */  
  private void merge(Comparable[] obj, int left, int center, int right) {   
    int mid = center + 1;   
    int third = left;   
    int tmp = left;   
    while (left <= center && mid <= right) { // 从两个数组中取出小的放入中间数组   
      if (obj[left].compareTo(obj[mid]) <= 0) {   
        bridge[third++] = obj[left++];   
      } else  
        bridge[third++] = obj[mid++];   
    }   
    // 剩余部分依次置入中间数组   
    while (mid <= right) {   
      bridge[third++] = obj[mid++];   
    }   
    while (left <= center) {   
      bridge[third++] = obj[left++];   
    }   
    // 将中间数组的内容拷贝回原数组   
    copy(obj, tmp, right);   
  }   
  
  /**  
   * *将中间数组bridge中的内容拷贝到原数组中  
   *   
   * @param obj 原数组的句柄  
   * @param left 要拷贝的第一个元素的下标  
   * @param right 要拷贝的最后一个元素的下标  
   */  
  private void copy(Comparable[] obj, int left, int right) {   
    while (left <= right) {   
      obj[left] = bridge[left];   
      left++;   
    }   
  }   
}
分享到:
评论

相关推荐

    多路归并算法

    多路归并算法是一种高效的排序方法,尤其在处理大量数据时表现出色。它基于分治策略,将大问题分解为小问题,然后合并这些小问题的解以得到最终的解决方案。在本例中,我们使用C#编程语言来实现这个算法,对文件中的...

    归并算法实现源码

    2-路归并算法(Two-Way Merge Sort)是归并排序的一种具体实现,它将待排序的序列拆分成两个子序列,然后逐个比较两个子序列中的元素,将较小的元素放入结果序列中,直到一个子序列为空,然后将另一个子序列的所有...

    归并算法思想总结

    ### 归并算法思想深度解析 归并算法是一种典型的分治策略在排序领域的应用,其核心思想在于将一个大规模的问题分解成若干个较小的、容易解决的子问题,然后将这些子问题的解合并,得到整个问题的解。在归并排序中,...

    归并算法的改进算法

    对于归并算法的四点改进 1.不回写,可以减少一半的数组移动 2.不递归 ,可以加快执行速度 3.无逆序,分段的时候递增的为一段,段数不确定 4.与插入相结合,因为数列个数在16以内的话插入排序会比归并排序要快

    分治思想写归并算法

    2. 归并算法步骤: - **分割**:检查数组的长度,如果长度为1,那么直接返回,因为一个元素本身就是有序的。否则,将数组分成两个相等(或接近相等)长度的子数组。 - **解决**:递归地对两个子数组进行归并排序。...

    C语言归并算法

    C语言归并算法 C语言归并算法是指一种使用递归函数和合并函数来实现的排序算法。该算法的主要思想是将一个数组分成两个小数组,分别对其进行排序,然后将两个有序数组合并成一个有序数组。 在这个算法中,需要定义...

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

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

    二路归并算法排序

    "二路归并算法排序" 二路归并算法排序是归并排序的一种实现方式,通过将两个有序表合并成为一个更大的有序表来实现排序。该算法的基本思想是将原始数组分成两个小数组,分别对这两个小数组进行排序,然后将两个有序...

    C#归并算法asp.net

    C#归并算法asp.netC#归并算法asp.netC#归并算法asp.netC#归并算法asp.netC#归并算法asp.netC#归并算法asp.netC#归并算法asp.netC#归并算法asp.netC#归并算法asp.netC#归并算法asp.netC#归并算法asp....

    归并算法的代码

    归并排序是一种经典的排序算法,基于分治策略。在计算机科学中,分治法是一种将大问题分解为小问题来解决的方法。归并排序就是利用这一思想,将一个大数组分成两个或更多小数组,分别对这些小数组进行排序,然后将...

    计算机算法设计与分析之归并算法

    计算机算法设计与分析之归并算法 C++完整代码实现归并排序

    使用归并算法来解决棋盘覆盖问题-基于C++实现.zip

    在这个案例中,我们将关注如何使用归并算法来解决这个问题,该算法是计算机科学中排序算法的一种。我们将深入探讨归并排序的原理,以及它是如何应用于棋盘覆盖问题的。 归并排序是一种分治策略,它将大问题分解为小...

    归并算法的一个题目及代码

    题目描述通常会给出一个问题情境,比如你需要对一个数组或者一系列元素进行排序,并要求使用归并算法来解决。这样的题目旨在考察你对归并排序的理解和实现能力。归并算法的步骤通常包括以下几个部分: 1. **分割**...

    一次归并算法的简单妙用

    一次归并算法是一种在计算机科学领域中非常实用且高效的排序方法。它主要应用于将两个或多个已排序的数组合并成一个有序数组的过程中。通过本文档的标题“一次归并算法的简单妙用”以及描述“里面用到基本思想是若第...

    数据结构 两个有序线性表的归并算法 西南交通大学

    数据结构-两个有序线性表的归并算法 在数据结构中,两个有序线性表的归并算法是一个基本的算法题目。该算法的目的是将两个有序线性表合并为一个有序线性表。该算法的实现可以采用顺序存储结构或链表存储结构。 ...

    单链表有序表二路归并算法

    通过建立单链表实现对一元多项式的相加,充分体现单链表的运用及有序表的运用

    归并算法python注释详细.zip

    你可以直接在PyCharm中打开归并算法的Python文件,进行编辑、运行和调试。 5. **Python作为开发语言**:Python以其简洁明了的语法和丰富的库支持而广受欢迎,特别适合教学和学习算法。在归并排序的实现中,Python的...

    数据结构实验报告-线性表-两个有序线性表的归并算法

    本次实验的主题是“数据结构实验报告-线性表-两个有序线性表的归并算法”。实验的主要目的是让学生掌握两个有序线性表的归并算法。具体来说,实验要求学生通过键盘输入数据来建立两个有序线性表,并最终将这两个有序...

    论文研究-一种基于独立性统计的子串归并算法.pdf

    通过动态增量的方法,在基于密度和自适应密度可达聚类算法的基础上,根据BIRCH算法中聚类特征的概念,利用簇特征设计与实现了一种新的动态增量聚类算法,解决了大型数据库聚类的有效性以及空间和时间复杂度问题。...

Global site tag (gtag.js) - Google Analytics