zoukankan      html  css  js  c++  java
  • 归并排序——Merge Sort

    基本思想:参考

    归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法的一个非常典型的应用。
    首先考虑下如何将2个有序数列合并。这个非常简单,只要从比较2个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。

    //将有序数组a[]和b[]合并到c[]中
    void MemeryArray(int a[], int n, int b[], int m, int c[])
    {
     int i, j, k;
    
     i = j = k = 0;
     while (i < n && j < m)
     {
         if (a[i] < b[j])
             c[k++] = a[i++];
         else
             c[k++] = b[j++]; 
     }
    
     while (i < n)
         c[k++] = a[i++];
    
     while (j < m)
         c[k++] = b[j++];
    }

    解决了上面的合并有序数列问题,再来看归并排序,其的基本思路就是将数组分成2组A,B,如果这2组组内的数据都是有序的,那么就可以很方便的将这2组数据进行排序。如何让这2组组内数据有序了?
    可以将A,B组各自再分成2组。依次类推,当分出来的小组只有1个数据时,可以认为这个小组组内已经达到了有序,然后再合并相邻的2个小组就可以了。这样通过先递归的分解数列再合并数列就完成了归并排序。

    过程:


     

    平均时间复杂度:O(NlogN)
    归并排序的效率是比较高的,设数列长为N,将数列分开成小数列一共要logN步,每步都是一个合并有序数列的过程,时间复杂度可以记为O(N),故一共为O(N*logN)。

    Java代码实现:

    /**
     * 归并排序
     * 
     * @author Administrator
     *
     */
    public class MergeSort {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            int[] arr = new int[] { 10, 3, 2, 5, 6, 1, -2, 3, 14, 12, 3, 8, 55, 44,
                    -10 };
            mergeSort(arr, 0, arr.length - 1);
            for (int i = 0; i < arr.length; i++) {
                System.out.print(arr[i] + "  ");
            }
        }
    
        private static void mergeSort(int[] arr, int start, int end) {
            if (start < end) {
                int middle = (start + end) / 2;
                mergeSort(arr, start, middle);
                mergeSort(arr, middle + 1, end);
                mergeArray(arr, start, middle, end);
            }
        }
    
        private static void mergeArray(int[] arr, int first, int middle, int end) {
            int i = first;
            int m = middle;
            int j = middle + 1;
            int n = end;
            int k = 0;
            int[] temp = new int[n - i + 1];
            while(i <= m && j <= n) {
                if(arr[i] < arr[j]) {
                    temp[k++] = arr[i++]; 
                } else {
                    temp[k++] = arr[j++];
                }
            }
            
            while(i <= m) {
                temp[k++] = arr[i++];
            }
            while(j <= n) {
                temp[k++] = arr[j++];
            }
            
            k = first;
            for(int element : temp) {
                arr[k++] = element;
            }
        }
    
    }
  • 相关阅读:
    尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行 已解决!
    iis 无法在Web服务器上启动调试。打开的URL的IIS辅助进程当前没有运行
    aspx页面,Page_Load 无人进入,解决
    Ajax后台传数组参数,接收不到报错!
    FusionCharts和highcharts 饼图区别!
    redis
    Hibernate不同数据库的连接及SQL方言
    Kafka
    Zookeeper
    BaseDao+万能方法 , HibernateDaoSupport
  • 原文地址:https://www.cnblogs.com/diyishijian/p/7776218.html
Copyright © 2011-2022 走看看