标签:合并 时间 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