• 归并排序 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+="
    ";
    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 }
  • 相关阅读:
    Android测试入门篇
    SQL的基本知识
    正则表达式
    ES5语法
    vscode
    继承小结
    工作遇到的问题
    后台程序员的HTTP缓存
    xhr下载图片/服务器向客户端推送消息
    HTTP2.0
  • 原文地址:https://www.cnblogs.com/TQCAI/p/7648446.html
Copyright © 2020-2023  润新知