一、分治算法的原理

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

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

合并算法Merge

 MERGE(A, p, q, r)
n1 ← q - p + 1
n2 ← r - q
create arrays L[1 ‥ n1 + 1] and R[1 ‥ n2 + 1]
for i ← 1 to n1
do L[i] ← A[p + i - 1]
for j ← 1 to n2
do R[j] ← A[q + j]
L[n1 + 1] ← ∞
R[n2 + 1] ← ∞
i ← 1
j ← 1
for k ← p to r
do if L[i] ≤ R[j]
then A[k] ← L[i]
i ← i + 1
else A[k] ← R[j]
j ← j + 1

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

 MERGE-SORT(A, p, r)
if p < r
then q ← ┕(p + r)/2┙
MERGE-SORT(A, p, q)
MERGE-SORT(A, q + 1, r)
MERGE(A, p, q, r)

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

 import java.util.Arrays;
import java.util.Comparator; public class MergeSort { /**
* 定义合并方法merge、mergesort方法
* 用泛型方法实现
*/
public static <T> void merge(T[] t, int p, int q, int r, Comparator<? super T> c)
{
T[] left = Arrays.copyOfRange(t, p, q);
T[] right = Arrays.copyOfRange(t, q, r); int indexleft = 0;
int indexright = 0; for(int i = p; i < r; i++)
{
//注意:这里只看算法了,就完全没管终止条件,要不然indexleft的值不断往上走,肯定会越界的,因为整个程序是从p到r的,而且
//indexleft和indexright还不一定哪个先结束呢,先结束了的话就没法比较了,就需要针对剩下的做个处理了。。。
//表示left到头了
if(indexleft >= left.length)
{
break;
}
//表示right到头了
if(indexright >= right.length)
{
System.arraycopy(left, indexleft, t, i, left.length-indexleft);
break;
}
if (c.compare(left[indexleft], right[indexright]) < 0)
{
t[i] = left[indexleft];
indexleft++;
}
else
{
t[i] = right[indexright];
indexright++;
}
}
} public static <T> void mergeSort(T[] t, int p, int r, Comparator<? super T> c)
{
if(p+1 < r)
{
int q = (p + r)/2;
mergeSort(t, p, q, c);
mergeSort(t, q, r, c);
merge(t, p, q, r, c);
}
} public static <T> void mergeSort(T[] t, Comparator<? super T> c)
{
mergeSort(t, 0, t.length, c);
} /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Integer[] ints = new Integer[]{2, 0, 5, 23, 1, 4, 8, 56, 19};
mergeSort(ints, new Comparator<Integer>(){
public int compare(Integer o1, Integer o2){
return o1 - o2;
}
}); for (int i = 0; i < ints.length; i++)
{
System.out.print(ints[i] + " ");
}
System.out.println();
} }

四、复杂度分析

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

Java-分治算法的更多相关文章

  1. 递归分治算法之二维数组二分查找(Java版本)

    [java] /** * 递归分治算法学习之二维二分查找 * @author Sking 问题描述: 存在一个二维数组T[m][n],每一行元素从左到右递增, 每一列元素从上到下递增,现在需要查找元素 ...

  2. 算法(Java实现)—— 分治算法

    分治算法 分治算法的设计模式 基本思想 把复杂问题分解成若干互相独立容易求解的子问题 经典问题 二分搜索 大整数乘法 棋盘覆盖 合并排序 快速排序 线性时间选择 最接近点对问题 循环赛日程表 汉诺塔 ...

  3. 从两个平方算法到分治算法-java

    先来看看问题的来源,假设有这么一个数组: 1 2 -5 4 -2 3 -3 4 -15 我们要求出其中连续字数组的和的最大值 例如这么可以很明显看出 4+ –2 + 3 + –3 + 4 = 6 所有 ...

  4. Java排序算法之快速排序

    Java排序算法之快速排序 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. R. Hoare在1962年提出.它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分 ...

  5. java排序算法之冒泡排序和快速排序

    总结一下Java排序算法,以便记忆. 各类排序的时间复杂度: 排序方法 时间复杂度(平均) 时间复杂度(最坏) 时间复杂度(最好) 空间复杂度 稳定性 复杂性 直接插入排序 O(n2)O(n2) O( ...

  6. java基础算法之快速排序

    快速排序(Quicksort)是对冒泡排序的一种改进.在大学学过之后现在基本忘了,最近在好多地方都看到说快速排序在面试会问到,于是自己也准备重新拾起以前忘记的东西来,慢慢的积累自己的基础知识.figh ...

  7. 史上最全的java随机数生成算法分享(转)

    这篇文章主要介绍了史上最全的java随机数生成算法,我分享一个最全的随机数的生成算法,最代码的找回密码的随机数就是用的这个方法 String password = RandomUtil.generat ...

  8. 常用Java排序算法

    常用Java排序算法 冒泡排序 .选择排序.快速排序 package com.javaee.corejava; public class DataSort { public DataSort() { ...

  9. 使用Java练习算法常用的基本操作

    一.使用Java练习算法常常需要使用控制台的数据输入和输出,下面记录一下基本的使用方法: 基本用法 import java.util.*; public class Main { public sta ...

  10. 计算几何 平面最近点对 nlogn分治算法 求平面中距离最近的两点

    平面最近点对,即平面中距离最近的两点 分治算法: int SOLVE(int left,int right)//求解点集中区间[left,right]中的最近点对 { double ans; //an ...

随机推荐

  1. nginx 配置文件配置

    server { listen 80 ; server_name test.com www.test.com; index index.html index.php index.htm; root / ...

  2. 机器学习进阶-图像基本操作-图像数据读取 1.cv2.imread(图片读入) 2.cv2.imshow(图片展示) 3.cv2.waitKey(图片停留的时间) 4.cv2.destroyAllWindows(清除所有的方框界面) 5.cv2.imwrite(对图片进行保存)

    1. cv2.imread('cat.jpg', cv2.IMGREAD_GRAYSCALE)  # 使用imread读入图像(BGR顺序), 使用IMGREAD_GRAYSCALE 使得读入的图片为 ...

  3. 【开发工具】 JEECG_3.7新版开发工具

    链接:http://pan.baidu.com/s/1gfthmAf    密码:2yfv

  4. day41-解决粘包问题

    一.socket缓冲区 研究粘包之前先看看socket缓冲区的问题: 二.socket缓存区的详细解释 每个socket被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区. write()/send ...

  5. Netty socket.io 启用Epoll 模式异常

    Epoll 环境为Linux 内核2.6 以上版本  Windows下不能启动 1:判断Linux环境 public static boolean isOSLinux() { Properties p ...

  6. unity "[ ]"标签

    [CanEditMultipleObjects]//可多对象编辑 public class Collider2DEditor:Editor {} [SerializeField]//序列化私有属性 p ...

  7. linux 2.6.32.220的一个crash记录

    有同事分析一个crash,我参与了分析,记录如下,供遇到相同crash的兄弟参考: crash> bt PID: TASK: ffff881723ce8080 CPU: COMMAND: &qu ...

  8. Java动态代理的两种实现方法

    注:文章转载自:https://blog.csdn.net/m0_38039437/article/details/77970633 一.代理的概念 动态代理技术是整个java技术中最重要的一个技术, ...

  9. 【377】only one element in a tuple

    Recently I am doing the assignment of COMP9021. It is too difficult and it is about the Knight and K ...

  10. Extjs获取Form中的数据

    var win = Ext.create("Ext.window.Window",{ width:300, height:200, title:"日期选择窗口" ...