算法导论示例-MergeSort

原创 2006年06月02日 23:02:00
/**
 * Introduction to Algorithms, Second Edition 
 * 2.3 MergeSort
 * @author 土豆爸爸
 * 
 */
public class MergeSort {
    public static void sort(int[] array, int p, int r) {
        if (p < r) {
            int q = (p + r) / 2;
            sort(array, p, q);
            sort(array, q + 1, r);
            merge(array, p, q, r);
        }
    }

    public static void merge(int[] array, int p, int q, int r) {
        int n1 = q - p + 1;
        int n2 = r - q;
        int[] L = new int[n1 + 1];
        int[] R = new int[n2 + 1];

        int i = 0;
        int j = 0;
        for (i = 0; i < n1; i++) {
            L[i] = array[p + i];
        }
        L[i] = Integer.MAX_VALUE;

        for (j = 0; j < n2; j++) {
            R[j] = array[q + j + 1];
        }
        R[j] = Integer.MAX_VALUE;

        i = 0;
        j = 0;
        for (int k = p; k <= r; k++) {
            if (L[i] <= R[j]) {
                array[k] = L[i++];
            } else {
                array[k] = R[j++];
            }
        }
    }
}

import junit.framework.TestCase;

public class MergeSortTest extends TestCase {
    public void testFixArray() {
        int[] array = { 5, 2, 4, 7, 1, 3, 2, 6 };
        MergeSort.sort(array, 0 , array.length -1);
        assertTrue(verifyOrdered(array));
    }

    public void testRandomArray() {
        int size = (int)(Math.random()* 1000);
        int[] array = new int[size];
        for(int i = 0; i < size; i++) {
            array[i] =  (int)(Math.random()* 10000);
        }
        
        MergeSort.sort(array, 0 , array.length -1);
        assertTrue(verifyOrdered(array));
    }
    
    private boolean verifyOrdered(int[] array) {
        for (int i = 1; i < array.length; i++) {
            if (array[i - 1] > array[i]) {
                return false;
            }
        }
        return true;
    }
}

算法导论第2章(2) merge 排序

合并排序 (merge sort) Merge排序的思想 合并排序是“分治法”的一个例子,它的主要思想就是:分解问题到若干个更小规模的问题,解决这些小规模问题,然后把小规模的问题合并,得到大规模问...
  • skywalkerVVV
  • skywalkerVVV
  • 2013年01月25日 12:52
  • 2598

算法导论 第二章MergeSort

#include #include #define N 100 using namespace std; void Merge(int array[],int begin,int mi...
  • rockerman_shane
  • rockerman_shane
  • 2011年01月28日 19:58
  • 374

4-1 Iterative Mergesort (9分)

一道简单的归并排序题
  • csucbMIT
  • csucbMIT
  • 2016年12月14日 13:35
  • 830

MergeSort归并排序图文代码详解

MergeSort归并排序就是将一组数分割成两个子数组,再对子数组进行排序,然后再归并起来。 在这个过程中,通过递归的方式对子数组进行归并排序。 过程(Wikipedia): 申请空间,...
  • wg1033755123
  • wg1033755123
  • 2015年04月12日 15:47
  • 2245

【算法导论学习-002】归并排序(MergeSort)

参考:《算法导论》P31、P34
  • BrilliantEagle
  • BrilliantEagle
  • 2014年07月31日 21:38
  • 899

MergeSort和QuickSort的比较

MergeSort和QuickSort是两种比较类似的sort方式,他们都是通过Divide and Conquer来实现的。都需要使用recursion的方式进行排序。 他们的相同之处在于原理...
  • u014421167
  • u014421167
  • 2014年10月26日 14:23
  • 1183

C++ Merge sort(归并排序)

归并排序(merge sort)是一个时间复杂度为O(nlogn)的基于比较的排序算法(comparison based sorting algorithm)。 归并排序大多数实现(implement...
  • a130737
  • a130737
  • 2014年07月28日 13:19
  • 2859

c编写Iterative Mergesort

Iterative Mergesort   (9分) How would you implement mergesort without using recursion? The ...
  • qq_31301089
  • qq_31301089
  • 2017年02月25日 12:14
  • 92

Iterative (non-recursive) Merge Sort

An iterative way of writing merge sort: #include using namespace std; void merge(int A[], int l, ...
  • jsc0218
  • jsc0218
  • 2014年05月29日 21:52
  • 1057

Collections.sort in JDK6:MergeSort

本文是对JDK6中Collections.sort方法的源码解析,也可以看作是对Comparison method violates its general contract!的后续分析。在JDK6中...
  • ghsau
  • ghsau
  • 2015年01月02日 14:01
  • 3779
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:算法导论示例-MergeSort
举报原因:
原因补充:

(最多只允许输入30个字)