算法归并排序学习

Posted blakehair

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法归并排序学习相关的知识,希望对你有一定的参考价值。

一:定义

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

二:解释

根据归并排序的具体实现方式可分为“从上往下”和“从下往上”两种。

1:从上往下


一个无序的序列先把它切分为两个相等长度的数组,一直向下递归,直到每个数组中只有一个元素时停止,此时每个数组一定是有序的(虽然只有一个元素),然后将两个有序的数组合并为一个,这其中会有排序,但因为两个数组都有序所以排起来相对简单,直到所有数组全部合并完成为一个有序大数组为止。(借用百度的图)

技术图片

 

2:从下往上

自我认为自下往上是自上往下的一部分啊,感觉合并的过程没啥区别呀,求大佬指点!

初始时即认可每个小数组都是有序的,然后使用循环两两合并,在这期间因为每个数组都有序,合并起来难度也不大,知道合并为一个大数组即完成。(借用skywang12345的图)

技术图片

 

三:代码实现

 1 package test;
 2 import java.util.*;
 3 
 4 public class test {
 5     public static int []aaa=new int[100];
 6     public static void main(String []args) {
 7         int n;
 8         System.out.println("请输入要排序的数字个数");
 9         Scanner sc=new Scanner(System.in);
10         n=sc.nextInt();
11         System.out.println("请输入要排序的所有数字");
12         for(int i=0;i<n;i++) {
13             aaa[i]=sc.nextInt();
14         }
15         mergesort(aaa,0,aaa.length-1);
16         for(int i=0;i<n;i++) {
17             System.out.println(aaa[i]);
18         }
19     }
20     public static void merge(int []a,int start,int mid,int end) {
21         int[]bbb=new int[end-start+1];
22         int i=start;int j=mid+1;int k=0;
23         while(i<=mid&&j<=end) {//两个有序数组循环挨个比较往里放
24             if(a[i]<a[j])
25            bbb[k++]=a[i++];
26             else {
27                 bbb[k++]=a[j++];
28             }
29     }
30         while(i<=mid)//有一个数组里还有剩的直接往里3放
31             bbb[k++]=a[i++];
32         while(i<=mid)
33             bbb[k++]=a[j++];
34         for(int c=0;c<k;c++)//整合到a中
35             a[start+c]=bbb[c];
36         bbb=null;
37     }
38 public static void mergesort(int []a,int start,int end) {
39     if(start==end)
40         return ;
41     else {
42     int mid=(start+end)/2;
43     mergesort(a,start,mid);
44     mergesort(a, mid+1, end);
45     merge(a, start, mid,end);
46     }
47 }
48 
49 }

四:分析

时间复杂度O(nlogn),比较次数小于快速排序,但移动次数一般多于快速排序。一般对于总体上无序,但是子项有序时最适合。

 

以上是关于算法归并排序学习的主要内容,如果未能解决你的问题,请参考以下文章

算法导论学习笔记-归并排序

JavaScript算法(归并排序与快速排序)

从零开始学习算法之归并排序[1](2.2归并排序)

经典算法学习——归并排序

重学数据结构和算法之归并排序快速排序

算法学习归并排序