分治算法—对数组排序

来源:互联网 发布:js控制input disabled 编辑:程序博客网 时间:2024/05/17 06:23
1.分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。 
分治法解题的一般步骤: 
(1)分解,将要解决的问题划分成若干规模较小的同类问题; 
(2)求解,当子问题划分得足够小时,用较简单的方法解决; 
(3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。
package algorithms;public class DivideAndConquer {    public static void main(String args[]) {        int[] num = {23, 27, 56 , 78, 99, 4, 24, 38, 55, 80};        System.out.println("未排序前:");        for (int a: num)            System.out.print(a + "   ");        System.out.println();                mergesort(num, 0, 9);   // merge(数组名,第一个数组第一个元素角标,第一个数组最后一个元素角标,第二个数组最后一个元素角标)        System.out.println("未排序前:");        for (int a: num)            System.out.print(a + "   ");        System.out.println();                    }        public static void merge(int[] A, int p, int q, int r) {        int n1 = q - p + 1;            int n2 = r - q;                int []L = new int[n1];             int []R = new int[n2];                   int i = 0;        int j = 0;        while (i != n1) {            L[i] = A[p + i];            ++i;        }        while (j != n2) {            R[j] = A[q + j + 1];            ++j;        }                i = j = 0;        int k = p;        while (i != n1 && j != n2) {            if (L[i] <= R[j]) {                A[k] = L[i];                ++i;            }            else {                A[k] = R[j];                ++j;            }            ++k;        }        if (i == n1)            while (j != n2) {                A[k] = R[j];                ++k;                ++j;            }        if (j == n2)            while (i != n1) {                A[k] = L[i];                ++k;                ++i;            }    }            public static void mergesort(int[] A, int p, int r) {        if (p < r) {            int q = (int)((p + r) / 2);            mergesort(A, p, q);            mergesort(A, q+1, r);            merge(A, p, q, r);        }    }}

0 0
原创粉丝点击