码迷,mamicode.com
首页 > 编程语言 > 详细

Java-分治算法

时间:2015-03-10 13:31:00      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:

一、分治算法的原理

分治算法就是将一个规模为N的问题分解成K个规模较小的子问题,这些子问题相互独立且与原问题性质相同,求出子问题的解,就可以得出原问题的解

二、分治算法的伪代码实现

合并算法Merge

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

分治算法:包括“分治”和“合并”

1 MERGE-SORT(A, p, r)
2  if p < r
3    then q ← ┕(p + r)/24         MERGE-SORT(A, p, q)
5         MERGE-SORT(A, q + 1, r)
6         MERGE(A, p, q, r)

三、分治算法的Java代码实现

 1 import java.util.Arrays;
 2 import java.util.Comparator;
 3 
 4 
 5 public class MergeSort {
 6 
 7     /**
 8      * 定义合并方法merge、mergesort方法
 9      * 用泛型方法实现
10      */
11     public static <T> void merge(T[] t, int p, int q, int r, Comparator<? super T> c)
12     {
13         T[] left = Arrays.copyOfRange(t, p, q);
14         T[] right = Arrays.copyOfRange(t, q, r);
15         
16         int indexleft = 0;
17         int indexright = 0;
18         
19         for(int i = p; i < r; i++)
20         {
21             //注意:这里只看算法了,就完全没管终止条件,要不然indexleft的值不断往上走,肯定会越界的,因为整个程序是从p到r的,而且
22             //indexleft和indexright还不一定哪个先结束呢,先结束了的话就没法比较了,就需要针对剩下的做个处理了。。。
23             //表示left到头了
24             if(indexleft >= left.length)
25             {
26                 break;
27             }
28             //表示right到头了
29             if(indexright >= right.length)
30             {
31                 System.arraycopy(left, indexleft, t, i, left.length-indexleft);  
32                 break;
33             }
34             if (c.compare(left[indexleft], right[indexright]) < 0)
35             {
36                 t[i] = left[indexleft];
37                 indexleft++;
38             }
39             else
40             {
41                 t[i] = right[indexright];
42                 indexright++;
43             }
44         }
45     }
46     
47     public static <T> void mergeSort(T[] t, int p, int r, Comparator<? super T> c) 
48     {
49         if(p+1 < r)
50         {
51             int q = (p + r)/2;
52             mergeSort(t, p, q, c);
53             mergeSort(t, q, r, c);
54             merge(t, p, q, r, c);
55         }
56     }
57     
58     public static <T> void mergeSort(T[] t, Comparator<? super T> c)
59     {
60         mergeSort(t, 0, t.length, c);
61     }
62     
63     /**
64      * @param args
65      */
66     public static void main(String[] args) {
67         // TODO Auto-generated method stub
68         Integer[] ints = new Integer[]{2, 0, 5, 23, 1, 4, 8, 56, 19};
69         mergeSort(ints, new Comparator<Integer>(){
70             public int compare(Integer o1, Integer o2){
71                 return o1 - o2;
72             }
73         });
74         
75         for (int i = 0; i < ints.length; i++)
76         {
77             System.out.print(ints[i] + " ");
78         }
79         System.out.println();
80     }
81 
82 }

 

四、复杂度分析

合并部分的时间复杂度为O(N)

Java-分治算法

标签:

原文地址:http://www.cnblogs.com/keke-xiaoxiami/p/4308328.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!