深入理解java代码实现分治算法
分治算法是一种递归算法,它将问题划分为几个独立的子问题,然后递归地解决这些子问题,最后将子问题的解合并起来得到原问题的解。分治算法常用于解决计算几何、统计学以及数值分析等领域的问题。
以归并排序为例说明分治算法的思想和实现过程。
归并排序的基本思想是将一个数组划分为两个子数组,然后递归地对这两个子数组进行排序,并且将这两个有序的子数组合并成一个有序的数组。
- 分
将数组划分为两个子数组
public static void mergeSort(int[] arr, int left, int right) { if (left < right) { int mid = (left + right) / 2; mergeSort(arr, left, mid); // 对左半部分进行递归排序 mergeSort(arr, mid + 1, right); // 对右半部分进行递归排序 merge(arr, left, mid, right); // 合并左右两个有序的子数组 } }
- 治
递归地对左右两个子数组进行排序
- 合
将两个有序的子数组合并为一个有序的数组
public static void merge(int[] arr, int left, int mid, int right) { int[] tmp = new int[right - left + 1]; // 临时数组 int i = left; // 左半部分数组的起始下标 int j = mid + 1; // 右半部分数组的起始下标 int k = 0; // 临时数组的起始下标 // 将左右两个有序的子数组合并为一个有序的数组 while (i <= mid && j <= right) { if (arr[i] <= arr[j]) { tmp[k++] = arr[i++]; } else { tmp[k++] = arr[j++]; } } // 将左半部分的剩余元素复制到临时数组中 while (i <= mid) { tmp[k++] = arr[i++]; } // 将右半部分的剩余元素复制到临时数组中 while (j <= right) { tmp[k++] = arr[j++]; } // 将临时数组中的元素复制回原数组中 for (int x = 0; x < k; x++) { arr[left + x] = tmp[x]; } }
完整代码如下:
public class MergeSort { public static void mergeSort(int[] arr, int left, int right) { if (left < right) { int mid = (left + right) / 2; mergeSort(arr, left, mid); // 对左半部分进行递归排序 mergeSort(arr, mid + 1, right); // 对右半部分进行递归排序 merge(arr, left, mid, right); // 合并左右两个有序的子数组 } } public static void merge(int[] arr, int left, int mid, int right) { int[] tmp = new int[right - left + 1]; // 临时数组 int i = left; // 左半部分数组的起始下标 int j = mid + 1; // 右半部分数组的起始下标 int k = 0; // 临时数组的起始下标 // 将左右两个有序的子数组合并为一个有序的数组 while (i <= mid && j <= right) { if (arr[i] <= arr[j]) { tmp[k++] = arr[i++]; } else { tmp[k++] = arr[j++]; } } // 将左半部分的剩余元素复制到临时数组中 while (i <= mid) { tmp[k++] = arr[i++]; } // 将右半部分的剩余元素复制到临时数组中 while (j <= right) { tmp[k++] = arr[j++]; } // 将临时数组中的元素复制回原数组中 for (int x = 0; x < k; x++) { arr[left + x] = tmp[x]; } } public static void main(String[] args) { int[] arr = {5, 3, 9, 1, 7, 2, 8, 4, 6}; mergeSort(arr, 0, arr.length - 1); System.out.println(Arrays.toString(arr)); } }
输出结果为:[1, 2, 3, 4, 5, 6, 7, 8, 9]
到此这篇关于深入理解java代码实现分治算法的文章就介绍到这了,更多相关java 分治算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
springboot整合shardingjdbc实现分库分表最简单demo
我们知道分库分表是针对某些数据量持续大幅增长的表,比如用户表、订单表等,而不是一刀切将全部表都做分片,这篇文章主要介绍了springboot整合shardingjdbc实现分库分表最简单demo,需要的朋友可以参考下2021-06-06解决java数值范围以及float与double精度丢失的问题
下面小编就为大家带来一篇解决java数值范围以及float与double精度丢失的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-06-06
最新评论