java 分治法-快速排序,算法(Java实现)—— 分治算法

分治算法

分治算法的设计模式

基本思想

把复杂问题分解成若干互相独立容易求解的子问题

经典问题

二分搜索

大整数乘法

棋盘覆盖

合并排序

快速排序

线性时间选择

最接近点对问题

循环赛日程表

汉诺塔

基本步骤

分解:将原问题分解成若干规模小的,相互独立,与原问题形式相同的子问题

解决:将子问题规模较小而容易被解决则直接解决,否则递归的解各个子问题

合并:将各个子问题的解合并成原问题的解

设计模式

Divide-and-Conquer(P){

if |p| <= n~0

then return(ADHOC(p))

//将 p分解为较小的子问题p1,p2,p3...pk

for i

do yi

T

return(T)

}

|p|表示问题p的规模

n0为阈值,表示当问题p的规模不超过n0时,问题已容易直接接触,不必再继续分解

ADHOC(p)时该分治法中的基本子算法,用于直接解小规模的问题p

因此,当p的规模不超过n0时直接用算法ADHOC(p)求解

分治法解决汉诺塔实例

思路分析

如果只有一个盘,A - >C

如果盘n > = 2,总是可看作两个盘1.下面的盘,2.上面的所有盘

先把最上面的盘A - > B

把最下边的盘A - > C

把B塔的所有盘从B - > C

代码实现

package com.why.divide_and_conquer_algorithm;

import java.util.concurrent.CountDownLatch;

/**

* @Description TODO 分治法解决汉诺塔问题

* @Author why

* @Date 2020/11/13 15:34

* Version 1.0

**/

public class HanoiTower {

public static void main(String[] args) {

hanoiTower(5,'A','B','C');

}

/**

* 汉诺塔的移动方法

* 使用分治算法

* @param num

* @param a

* @param b

* @param c

*/

public static void hanoiTower(int num,char a,char b,char c){

//如果只有一个盘

if(num == 1){

System.out.println("第1个盘从 "+ a + "->" + c);

}else {

//最上面的盘A->B,移动过程会使用到c

hanoiTower(num - 1,a,c,b);

//最下边的盘A->C

System.out.println("第"+ num + "个盘从 " + a + "->" + c);

//把B塔的虽有盘从 B -> C 移动过程使用到a塔

hanoiTower(num - 1,b,a,c);

}

}

}

标签:Java,分治,param,问题,算法,num,汉诺塔

来源: https://www.cnblogs.com/whystudyjava/p/14151309.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的分治算法实现快速排序的步骤如下: 1. 选择一个基准元素(pivot),可以是数组中的任意一个元素。 2. 将数组分成两部分,小于等于基准元素的放在左边,大于基准元素的放在右边。 3. 对左右两部分分别进行递归调用快速排序算法,直到每个部分只有一个元素或为空。 4. 合并左右两部分,得到最终排序结果。 下面是Java代码实现快速排序的示例: ```java public class QuickSort { public static void quickSort(int[] arr, int low, int high) { if (low < high) { int pivotIndex = partition(arr, low, high); // 获取基准元素的位置 quickSort(arr, low, pivotIndex - 1); // 对左侧子数组进行快速排序 quickSort(arr, pivotIndex + 1, high); // 对右侧子数组进行快速排序 } } private static int partition(int[] arr, int low, int high) { int pivot = arr[low]; // 选择第一个元素作为基准元素 int i = low + 1; // 左指针 int j = high; // 右指针 while (i <= j) { if (arr[i] <= pivot) { i++; } else if (arr[j] > pivot) { j--; } else { swap(arr, i, j); // 交换左右指针所指向的元素 } } swap(arr, low, j); // 将基准元素放到正确的位置上 return j; // 返回基准元素的位置 } private static void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } public static void main(String[] args) { int[] arr = {5, 2, 9, 1, 7, 6, 3}; quickSort(arr, 0, arr.length - 1); for (int num : arr) { System.out.print(num + " "); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值