分治算法实现经典归并排序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. }
相关文章
|
1月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
74 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
16天前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
32 2
|
1月前
|
算法 搜索推荐 Shell
数据结构与算法学习十二:希尔排序、快速排序(递归、好理解)、归并排序(递归、难理解)
这篇文章介绍了希尔排序、快速排序和归并排序三种排序算法的基本概念、实现思路、代码实现及其测试结果。
23 1
|
1月前
|
算法 Java 数据中心
探讨面试常见问题雪花算法、时钟回拨问题,java中优雅的实现方式
【10月更文挑战第2天】在大数据量系统中,分布式ID生成是一个关键问题。为了保证在分布式环境下生成的ID唯一、有序且高效,业界提出了多种解决方案,其中雪花算法(Snowflake Algorithm)是一种广泛应用的分布式ID生成算法。本文将详细介绍雪花算法的原理、实现及其处理时钟回拨问题的方法,并提供Java代码示例。
74 2
|
1月前
|
存储 搜索推荐 算法
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
|
1月前
|
存储 算法 搜索推荐
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
72 0
|
1月前
|
搜索推荐 Java Go
深入了解归并排序算法
深入了解归并排序算法
21 0
|
3月前
|
算法 搜索推荐 Java
算法实战:手写归并排序,让复杂排序变简单!
归并排序是一种基于“分治法”的经典算法,通过递归分割和合并数组,实现O(n log n)的高效排序。本文将通过Java手写代码,详细讲解归并排序的原理及实现,帮助你快速掌握这一实用算法。
42 0
|
3月前
|
搜索推荐 Java
|
3月前
|
搜索推荐 算法 Java
经典排序算法之-----选择排序(Java实现)
这篇文章通过Java代码示例详细解释了选择排序算法的实现过程,包括算法的基本思想、核心代码、辅助函数以及测试结果,展示了如何通过选择排序对数组进行升序排列。
经典排序算法之-----选择排序(Java实现)
下一篇
无影云桌面