好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

Java 详细讲解分治算法如何实现归并排序

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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

package Sort;

 

import java.util.Arrays;

/**

  * 归并排序:

  *

  * 利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,

  *

  * 而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。

  * @author lenovo

  *

  */

public class MergeSort {

     public static void main(String[] args) {

         int [] a= { 5 , 8 , 6 , 3 , 9 , 8 , 7 , 1 , 4 , 21 ,- 8 , 46 };

         int [] temp= new int [a.length];

         mergeSort(a, 0 , a.length- 1 , temp);

         System.out.println(Arrays.toString(a));

     }

     public static void mergeSort( int [] arr, int left, int right, int [] temp) {

         if (left<right) {

             int mid=(left+right)/ 2 ;

             mergeSort(arr, left, mid, temp);

             mergeSort(arr, mid+ 1 ,right, temp);

             merge(arr, left, mid, right, temp);

         }

     }

     public static void merge( int [] arr, int left, int mid, int right, int [] temp) {

         int l=left; //左边序列的起始位置

         int r=mid+ 1 ; //右边序列的起始位置

         int t= 0 ; //中间数组的当前元素下标

         while (l<=mid &&r<=right ) { //左边或右边没结束

             //那边小就将那边的元素放入到临时数组中

             if (arr[l]<=arr[r]) {

                 temp[t++]=arr[l++];

             } else {

                 temp[t++]=arr[r++];

             }

         }

         //while循环结束,说明有一边已经遍历完毕,将另一边剩余的元素放入到临时数组中

         while (l<=mid) {

             temp[t++]=arr[l++];

         }

         while (r<=right) {

             temp[t++]=arr[r++];

         }

         //将临时数组中的有序序列copy到原数组中

         t= 0 ;

         int templeft=left;

         while (templeft<=right) {

             arr[templeft++]=temp[t++];

         }

     }

}

到此这篇关于Java 详细讲解分治算法如何实现归并排序的文章就介绍到这了,更多相关Java 归并排序内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

原文链接:https://blog.csdn.net/qq_52360069/article/details/123580334

查看更多关于Java 详细讲解分治算法如何实现归并排序的详细内容...

  阅读:18次