分治法的基本思想

将一个规模为n的问题分解成k个规模较小的子问题,这些子问题互相独立且与原问题相同。递归地解决这些子问题,然后将各子问题的解合并得到原问题的解。

(一)二分搜索技术

二分搜索技术利用了元素间的次序关系,采用分治策略,其基本思想是:将n个元素分成个数大致相同的凉拌,取a[n/2]与x作比较。如果x=a[n/2],则找到x,如果x<a[n/2],则只在数组a的左半边查找,如果x>a[n/2],则只在右半边查找。

public class Binary_Search {public static void main(String[] args) {Binary_Search bi=new Binary_Search();int arr[]={1,2,3,4,5,6,7,8,9,10};bi.Search(arr, 0, arr.length-1, 5);}public int Search(int arr[],int left,int right,int s) {int middle=(left+right)/2;if(s==arr[middle]) {System.out.println(middle);//打印目标值所在数组的下标return middle;}if(s<arr[middle]) {Search(arr,left,middle-1,s);//递归调用,分治}if(s>arr[middle]) {Search(arr,middle+1,right,s);//递归调用,分治}return 1;}
}

(二)棋盘覆盖问题

问题描述:在一个2k×2k个方格组成的棋盘中,若有一个方格与其他方格不同,则称该方格为特殊方格,且称该棋盘为特殊棋盘。我们要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。

思路:用分治策略,可以设计解棋盘覆盖问题的一个简洁的算法。特殊方格必位于4个较小棋盘之一中,其余三个棋盘无特殊方格。为了将这三个无特殊方格的子棋盘转化为特殊棋盘,可以用一个L型骨牌覆盖这3个较小棋盘的汇合处。这三个子棋盘被L骨牌覆盖的方格就成为该棋盘上的特殊方格,从而将原问题转化为4个较小规模的棋盘覆盖问题。递归地使用这种分割,直至棋盘简化为1x1棋盘。
代码如下

public class ChessBoard{int tile=1;static int board[][]=new int[8][8];public static void main(String[] args) {ChessBoard cb=new ChessBoard();cb.chessboard(0,0,1,1,8);for(int i=0;i<board.length;i++) {for(int j=0;j<board.length;j++) {System.out.print(String.format("%3d", board[i][j]));}System.out.println();}}/** tr:棋盘的行* rc:棋盘的列* dr:特殊棋格的行* dt:特殊棋格的列* s:棋盘大小*/public void chessboard(int tr,int tc,int dr,int dc,int size) {if(size==1) {return;}int t=tile++;int s=size/2;//覆盖左上角的棋盘if(dr < tr+s && dc < tc+s) {chessboard(tr,tc,dr,dc,s);//特殊方格在该棋盘}else {board[tr+s-1][tc+s-1]=t;//特殊方格不在该棋盘chessboard(tr,tc,tr+s-1,tc+s-1,s);}//覆盖右上角的棋盘if(dr < tr+s && dc >= tc+s) {chessboard(tr,tc+s,dr,dc,s);//特殊方格在该棋盘}else {board[tr+s-1][tc+s]=t;//特殊方格不在该棋盘chessboard(tr,tc+s,tr+s-1,tc+s,s);}//覆盖左下角的棋盘if(dr >= tr+s && dc < tc+s) {chessboard(tr+s,tc,dr,dc,s);//特殊方格在该棋盘}else {board[tr+s][tc+s-1]=t;chessboard(tr+s,tc,tr+s,tr+s-1,s);}//覆盖右下角的棋盘if(dr>=tr+s && dc>=tc+s) {chessboard(tr+s,tc+s,dr,dc,s);}else {board[tr+s][tc+s]=t;chessboard(tr+s,tc+s,tr+s,tc+s,s);}}}

程序运行结果如下

(三)合并排序

合并排序算法是用分治策略实现对n个元素进行排序的算法,其基本思想是:将待排序元素分成大小大致相同的两个子集合,然后分别对两个子集合进行排序,最后将两个排好序的子集合并成按要求排序的集合。

public class MergeSort {static int arr[]= {23,45,76,3,8,5,46,4};//待排序数组static int temp[]=new int[arr.length];//过渡数组public static void main(String[] args) {MergeSort ms=new MergeSort();ms.mergesort(arr,temp,0,arr.length-1);//打印输出排完序后的情况for(int i=0;i<arr.length;i++) {System.out.print(arr[i]+" ");}}public void mergesort(int arr[],int temp[],int left,int right) {if(left<right) {int middle=(left+right)/2;mergesort(arr,temp,left,middle);mergesort(arr,temp,middle+1,right);merge(arr,temp,left,middle,right);}}public void merge(int arr[],int temp[],int left,int middle,int right) {int i=0;int j=left,k=middle+1;//遍历寻找while(j<=middle&&k<=right) {if(arr[j]<arr[k]) {temp[i++]=arr[j++];}else {temp[i++]=arr[k++];}}//当有一个数组为空时直接存到数组里面while(j<=middle) {temp[i++]=arr[j++];}while(k<=right) {temp[i++]=arr[k++];}//把临时数组中的元素复制到目标数组中for(int m=0;m<i;m++) {arr[left+m]=temp[m];}}
}

(四)快速排序

快速排序算法也是基于分治策略的一个算法,其基本思想是:在数组中选一个基准数(通常为数组第一个),将数组中小于基准数的数据移到基准数左边,大于基准数的移到右边, 对于基准数左、右两边的数组,不断重复以上两个过程,直到每个子集只有一个元素,即为全部有序。即:
1,分解
2,递归求解
3,合并

public class QuickSort {static int array[]={12,43,6,2,56,5};public static void main (String[] args){QuickSort qs=new QuickSort();qs.quickSort(arr,0,arr.length-1);for(int i=0;i<arr.length;i++){System.out.print(array[i]+" ");}}private static void quickSort(int[] array, int left, int right) {if (left>=right) {return;}int i = left, j = right,;int index = array[i]; //选择第一个数为基准数while (i < j) {while (i < j && array[j] >= index) { j--;}if (i < j) {array[i++] = array[j]; }while (i < j && array[i] < index) {i++;}if (i < j) {array[j--] = array[i]; }}array[i] = index; // 将基准数填入quickSort(array, left, i - 1); // 递归调用,分治quickSort(array, i + 1, right); // 递归调用,分治}

用Java实现递归与分治系列(二)相关推荐

  1. Java I/O系统学习系列二:输入和输出

    编程语言的I/O类库中常使用流这个抽象概念,它代表任何有能力产出数据的数据源对象或者是有能力接收数据的接收端对象."流"屏蔽了实际的I/O设备中处理数据的细节. 在这个系列的第一篇 ...

  2. java tts引擎_Android TTS系列二——如何开发一款系统级tts引擎?

    上篇文章Android TTS系列一--如何让app具备tts能力分享了如何通过第三方tts sdk和Android speech包下的接口来拥有tts能力,这次分享下如何开发一款系统级tts引擎.代 ...

  3. java原子操作cas_java并发编程系列二:原子操作/CAS

    什么是原子操作 不可被中断的一个或者一系列操作 实现原子操作的方式 Java可以通过锁和循环CAS的方式实现原子操作 CAS( Compare And Swap )  为什么要有CAS? Compar ...

  4. python递归算法 电影院票价问题_算法课堂实验报告(二)——python递归和分治(第k小的数,大数乘法问题)...

    python实现递归和分治 一.开发环境 开发工具:jupyter notebook 并使用vscode,cmd命令行工具协助编程测试算法,并使用codeblocks辅助编写C++程序 编程语言:py ...

  5. 【JAVA编码】 JAVA字符编码系列二:Unicode,ISO-8859,GBK,UTF-8编码及相互转换

    http://blog.csdn.net/qinysong/article/details/1179489 这两天抽时间又总结/整理了一下各种编码的实际编码方式,和在Java应用中的使用情况,在这里记 ...

  6. JAVA面试常考系列二

    转载自 JAVA面试常考系列二 题目一 解释一下线程和进程 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调 ...

  7. 基础算法(二):迭代、递归与分治

    前言 在这篇文章中,荔枝会梳理一些迭代.递归和分治的基本概念.同时也会有样题示例辅助理解这三种算法的应用. 文章目录 前言 一.迭代 1.1 概念 1.2 样题示例 二.递归 2.1 概念 2.2 样 ...

  8. JAVA入门基础6**(系列更新)———面向对象(二)的继承,抽象,接口

    **JAVA入门基础6**(系列更新)---面向对象(二)的继承,抽象,接口 面向对象2 大致总结 继承 @Override super();的应用 调用顺序 构造顺序 多态 什么是多态??? 多态有 ...

  9. 【表白系列二】Java实现的表白窗体应用~JFrame实现(雪花飘落)

    系列文章目录 [表白系列一]Java实现的表白窗体应用~JFrame实现(适合JFrame小白入门练习) [表白系列二]Java实现的表白窗体应用~JFrame实现(雪花飘落) 提示:写完文章后,目录 ...

最新文章

  1. 提升 NLP 实战技能的一点建议
  2. 一步步写一个符合Promise/A+规范的库 1
  3. go程序开发注意事项
  4. java webservice接口开发_给Java新手的一些建议----Java知识点归纳(J2EE and Web 部分)
  5. SQL 语法参考手册
  6. java applet html_将图像从Java Applet传递到HTML
  7. 普通的测试员和牛逼的测试员有什么区别?完成这两次跨越,你也可以
  8. 周博通 | 阿里开源首个 DL 框架、4000台服务器真实数据集;明年1月开源Blink...
  9. mysql 表单插入数据_PHP表单数据写入MySQL数据库的代码
  10. 联想LJ2600D硒鼓加粉后清零操作
  11. 嵌入式linux操作framebuffer显示bmp图片
  12. iptables、firewalld和ufw区别linux
  13. ps画笔工具、填充选区文字工具、合成
  14. 如何开启WIN10卓越性能模式
  15. 树莓派开启 wifi 热点
  16. VMware虚拟机安装MAC OS原版系统,轻松体验苹果操作系统
  17. 【计算机网络】2.1 应用层协议原理
  18. [C8MIm]SbF6离子液体379712-23-9/1-辛基-3-甲基咪唑六氟锑酸盐的分子量:431.0748392对吗?
  19. 解决 卸载Mysql后,服务还在的问题
  20. 北京大学,新增设置数据科学与工程博士点!

热门文章

  1. MATLAB实现雅可比与高斯塞德尔迭代
  2. Jieba库基本用法
  3. net.sf.cglib.beans.BeanCopier用途
  4. 计划的主体部分应有哪些内容_计划的正文主体一般有哪三个部分构成
  5. 无人机倾斜摄影全景建模三维数字沙盘电子沙盘人工智能开发教程视频第7课
  6. vxworks6.6 ramdisk的创建
  7. Matlab - 在Figure界面去掉图像的坐标刻度
  8. perforce p4v linux,Perforce p4v下载
  9. studiolibrary安装_初学者daz studio中文基础安装布局教程
  10. 无线自组网AODV路由机制matlab仿真