分治算法实现经典归并排序java实现

简介: 分治法,字面意思是“分而治之”,就是把一个复杂的1问题分成两个或多个相同或相似的子问题,再把子问题分成更小的子问题直到最后子问题可以简单地直接求解,原问题的解即子问题的解的合并,这个思想是很多高效算法的基础,例如排序算法(快速排序,归并排序),傅里叶变换(快速傅里叶变换)等。

目录

1.什么是分治算法
分治法
基本思想
2.分治算法的体现:归并排序
归并排序
基本思想
3.代码实现
__
1.什么是分治算法
分治法
分治法,字面意思是“分而治之”,就是把一个复杂的1问题分成两个或多个相同或相似的子问题,再把子问题分成更小的子问题直到最后子问题可以简单地直接求解,原问题的解即子问题的解的合并,这个思想是很多高效算法的基础,例如排序算法(快速排序,归并排序),傅里叶变换(快速傅里叶变换)等。
基本思想
分治法的基本思想:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。
2.分治算法的体现:归并排序
归并排序
归并排序( MERGE - SORT )是利用归并的思想实现的排序方法,该算法采用经典的分治( divide - and - conquer )策略(分治法将问题分( divide )成一些小的问题然后递归求解,而治( conquer )的阶段则将分的阶段得到的各答案”修补”在一起,即分而治之)。
基本思想
流程图(以对数组[8,4,5,7,1,3,6,2]排序为例)

再来看看治阶段,我们需要将两个已经有序的子序列合并成一个有序序列,比如上图中的最后一次合并,要将
[4,5,7,8]和[1,2,3,6]两个已经有序的子序列,合并为最终序列[1,2,3,4,5,6,7,8],来看下实现步骤。

3.代码实现

  1. package Sort;
  2. import java.util.Arrays;
  3. /**
    • 归并排序:
    • 利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,
    • 而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。
    • @author lenovo
  4. *
  5. */
  6. public class MergeSort {
  7. public static void main(String[] args) {
  8. int[] a= {5,8,6,3,9,8,7,1,4,21,-8,46};
  9. int[] temp=new int[a.length];
  10. mergeSort(a, 0, a.length-1, temp);
  11. System.out.println(Arrays.toString(a));
  12. }
  13. public static void mergeSort(int[] arr,int left,int right,int[] temp) {
  14. if(left<right) {
  15. int mid=(left+right)/2;
  16. mergeSort(arr, left, mid, temp);
  17. mergeSort(arr, mid+1,right, temp);
  18. merge(arr, left, mid, right, temp);
  19. }
  20. }
  21. public static void merge(int[] arr,int left,int mid,int right,int[] temp) {
  22. int l=left;//左边序列的起始位置
  23. int r=mid+1;//右边序列的起始位置
  24. int t=0;//中间数组的当前元素下标
  25. while(l<=mid &&r<=right ) {//左边或右边没结束
  26. //那边小就将那边的元素放入到临时数组中
  27. if(arr[l]<=arr[r]) {
  28. temp[t++]=arr[l++];
  29. }else {
  30. temp[t++]=arr[r++];
  31. }
  32. }
  33. //while循环结束,说明有一边已经遍历完毕,将另一边剩余的元素放入到临时数组中
  34. while(l<=mid) {
  35. temp[t++]=arr[l++];
  36. }
  37. while(r<=right) {
  38. temp[t++]=arr[r++];
  39. }
  40. //将临时数组中的有序序列copy到原数组中
  41. t=0;
  42. int templeft=left;
  43. while(templeft<=right) {
  44. arr[templeft++]=temp[t++];
  45. }
  46. }
  47. }
相关文章
|
30天前
|
算法 搜索推荐 Java
算法实战:手写归并排序,让复杂排序变简单!
归并排序是一种基于“分治法”的经典算法,通过递归分割和合并数组,实现O(n log n)的高效排序。本文将通过Java手写代码,详细讲解归并排序的原理及实现,帮助你快速掌握这一实用算法。
37 0
|
1月前
|
搜索推荐 Java
|
1月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
37 6
|
1月前
|
搜索推荐 算法 Java
经典排序算法之-----选择排序(Java实现)
这篇文章通过Java代码示例详细解释了选择排序算法的实现过程,包括算法的基本思想、核心代码、辅助函数以及测试结果,展示了如何通过选择排序对数组进行升序排列。
经典排序算法之-----选择排序(Java实现)
|
1月前
|
搜索推荐 算法 Java
|
1月前
|
存储 算法 Java
LeetCode经典算法题:打家劫舍java详解
LeetCode经典算法题:打家劫舍java详解
46 2
|
1月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
37 1
|
1月前
|
存储 算法 Java
LeetCode经典算法题:预测赢家+香槟塔java解法
LeetCode经典算法题:预测赢家+香槟塔java解法
35 1
|
30天前
|
数据采集 搜索推荐 算法
【高手进阶】Java排序算法:从零到精通——揭秘冒泡、快速、归并排序的原理与实战应用,让你的代码效率飙升!
【8月更文挑战第21天】Java排序算法是编程基础的重要部分,在算法设计与分析及实际开发中不可或缺。本文介绍内部排序算法,包括简单的冒泡排序及其逐步优化至高效的快速排序和稳定的归并排序,并提供了每种算法的Java实现示例。此外,还探讨了排序算法在电子商务、搜索引擎和数据分析等领域的广泛应用,帮助读者更好地理解和应用这些算法。
21 0
|
1月前
|
算法 Java
HanLP — HMM隐马尔可夫模型 -- 维特比(Viterbi)算法 --示例代码 - Java
HanLP — HMM隐马尔可夫模型 -- 维特比(Viterbi)算法 --示例代码 - Java
29 0