归并排序 MergeSort

今天第一次看懂了严奶奶的代码( ̄▽ ̄)~*,然后按照厌奶那的思路进行了一波coding,稍加调试后即可跑起来。

学习链接:排序七 归并排序图解排序算法(四)之归并排序


 

merge函数:将两个有序序列拼接成一个有序序列

 1     //对[a,b]∈in,[b+1,c]∈in进行排序。
 2     //对in中的数据进行排序之后,输出到out中
 3     //升序
 4      void merge(int in[],int a,int b,int c){
 5          //设置变量i对[a,b]进行遍历,j对[b+1,c]进行遍历,k对out进行遍历
 6          int[] out=new int[in.length];
 7          int i,j,k;
 8          for(i=a,j=b+1,k=a;
 9                  i<=b && j<=c;
10                  k++){
11              if(in[i]<in[j]){//挑选最小的元素放入out中
12                  out[k]=in[i++];//i∈[a,b]中的元素是最小的
13              }else{
14                  out[k]=in[j++];//j∈[b+1,c]中的元素是最小的
15              }
16          }
17          //遍历完之后,对剩余元素进行处理
18          int m=0,n=0;
19          boolean move=false;
20          if(i<=b){m=i;n=b;move=true;}    //i∈[a,b]中的元素没有遍历完
21          if(j<=c){m=j;n=c;move=true;}    //j∈[b+1,c]中的元素没有遍历完
22          for(i=m;i<=n && move;i++) out[k++]=in[i];
23          for(i=a;i<=c;i++) in[i]=out[i];//临时数组放回原数组
24          
25          int t;
26          t=0;
27      }

 

递归函数MSort:

1      //递归函数
2      void MSort(int in[],int a,int b){//将[a,b]的元素进行排序
3          if(a!=b){
4              int split=(a+b)/2;
5              MSort(in,a,split);
6              MSort(in,split+1,b);
7              merge(in,a,split,b);//栈底
8          }
9      }

归并排序MergeSort:

1      MergeSort(int[] nums){
2          MSort(nums,0,nums.length-1);
3          sortAns=nums;
4      }

 


 

 

完整代码:

 1 public class Main {
 2 
 3     public static void main(String[] args) {
 4         int []nums={2,1,3,0,-1,12,90,23,1};
 5         MergeSort sort=new MergeSort(nums);
 6         System.out.print(sort);
 7         sort.test();
 8     }
 9 }
10 
11 class MergeSort{
12     int [] sortAns;
13      public String toString(){
14          int i;
15          String str=new String("");
16          for(i=0;i<sortAns.length;i++) str+=String.valueOf(sortAns[i])+" ";
17          str+="\n";
18          return str;
19      }
20     //对[a,b]∈in,[b+1,c]∈in进行排序。
21     //对in中的数据进行排序之后,输出到out中
22     //升序
23      void merge(int in[],int a,int b,int c){
24          //设置变量i对[a,b]进行遍历,j对[b+1,c]进行遍历,k对out进行遍历
25          int[] out=new int[in.length];
26          int i,j,k;
27          for(i=a,j=b+1,k=a;
28                  i<=b && j<=c;
29                  k++){
30              if(in[i]<in[j]){//挑选最小的元素放入out中
31                  out[k]=in[i++];//i∈[a,b]中的元素是最小的
32              }else{
33                  out[k]=in[j++];//j∈[b+1,c]中的元素是最小的
34              }
35          }
36          //遍历完之后,对剩余元素进行处理
37          int m=0,n=0;
38          boolean move=false;
39          if(i<=b){m=i;n=b;move=true;}    //i∈[a,b]中的元素没有遍历完
40          if(j<=c){m=j;n=c;move=true;}    //j∈[b+1,c]中的元素没有遍历完
41          for(i=m;i<=n && move;i++) out[k++]=in[i];
42          for(i=a;i<=c;i++) in[i]=out[i];//临时数组放回原数组
43          
44          int t;
45          t=0;
46      }
47      //递归函数
48      void MSort(int in[],int a,int b){//将[a,b]的元素进行排序
49          if(a!=b){
50              int split=(a+b)/2;
51              MSort(in,a,split);
52              MSort(in,split+1,b);
53              merge(in,a,split,b);//栈底
54          }
55      }
56      MergeSort(int[] nums){
57          MSort(nums,0,nums.length-1);
58          sortAns=nums;
59      }
60      MergeSort(){}
61 }

 

posted @ 2017-10-10 23:32  TQCAI  阅读(190)  评论(0编辑  收藏  举报