码迷,mamicode.com
首页 > 编程语言 > 详细

【算法】归并排序学习

时间:2019-03-03 14:47:49      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:合并   时间   can   大数   rgs   简单   ann   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),比较次数小于快速排序,但移动次数一般多于快速排序。一般对于总体上无序,但是子项有序时最适合。

 

【算法】归并排序学习

标签:合并   时间   can   大数   rgs   简单   ann   com   有序   

原文地址:https://www.cnblogs.com/BlakeHair/p/10465539.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!