zoukankan      html  css  js  c++  java
  • 算法之合并排序

    合并排序(MergeSort):又叫归并排序,该算法是用分治策略实现对N个元素进行排序的算法。时间复杂度为O(nlogn)。

    合并排序的基本思想是:将待排序元素分成大小大致相同的两个子集合,分别对两个子集合进行排序,最终将排好序的子集合合并成所要求的排好序的集合,如图:

    合并排序的方法可以用递归来实现,代码如下:

     1 private static int[] mergeSort(int[] num,int[] num1,int l,int r){
     2     int mid;
     3     int[] num2 = new int[r + 1];
     4     if(l == r)
     5         num1[l] = num[l];
     6     else{
     7         mid = (l + r) / 2;
     8         //左半部分递归
     9         mergeSort(num,num2,l,mid);
    10         //右半部分递归
    11         mergeSort(num,num2,mid+1,r);
    12         //由num2去归并,返回的值放到num1中,num1赋新值,其实就是更新num2,然后让num2再去归并,返回新的num1
    13         merge(num2,num1,l,mid,r);
    14     }
    15     return num1;
    16 }

    合并步骤的代码如下:

     1 private static void merge(int[] num,int[] num1,int l,int mid,int r){
     2     int i,j,k;
     3     i = l;
     4     j = mid +1;
     5     k = l;
     6     //选择较小的数放入num1数组中
     7     while(i <= mid && j <= r){
     8         if(num[i] <= num[j])
     9             num1[k++] = num[i++];
    10         else
    11             num1[k++] = num[j++];
    12     }
    13     //将剩下的数放入num1数组中
    14     while(i <= mid)                   
    15         num1[k++] = num[i++];
    16     while(j <= r)
    17         num1[k++] = num[j++];
    18 }

    测试代码:

    1 public static void main(String[] args) {
    2     int[] aw={73,12,87,43,25,93,32,26,57,65};
    3     int[] aw2 = new int[aw.length];
    4     aw = mergeSort(aw,aw2,0,aw.length-1);
    5     for(int i : aw)
    6         System.out.print(i+" ");
    7 }

    因为结果无异常,就不贴出输出结果了,有兴趣的读者可以自己动手试试。

    以上代码的l和r都表示left和right,即要排序的左边界和右边界。

    有不对之处以及改进建议,欢迎提出!

  • 相关阅读:
    LeetCode120 Triangle
    LeetCode119 Pascal's Triangle II
    LeetCode118 Pascal's Triangle
    LeetCode115 Distinct Subsequences
    LeetCode114 Flatten Binary Tree to Linked List
    LeetCode113 Path Sum II
    LeetCode112 Path Sum
    LeetCode111 Minimum Depth of Binary Tree
    Windows下搭建PHP开发环境-WEB服务器
    如何发布可用于azure的镜像文件
  • 原文地址:https://www.cnblogs.com/Not-Famous/p/3650604.html
Copyright © 2011-2022 走看看