zoukankan      html  css  js  c++  java
  • 归并排序Merge_Sort

    归并排序的基本思想是指递归的将待排序数组分为两组,直到无法再分,停止条件中间数m等于左边界或者右边界。如下图所示:

    分完之后进行合并,如果两个合并的部分均只有1个元素,那么直接进行比较后交换即可。

    如果每个部分拥有多个数据,则进行合并。以{4,6}和{8}合并为例:

     先申请一个等长的数组,第一轮各有一个指针指向4和8,选择一个更小的数据填充到新数组中。指针向前移一位,直到两个指针均遍历完所有的数据。

                   

    红色的箭头表示本部分已经遍历完毕。

    时间复杂度分析:O(NlogN)

    代码:

    package Sort;
    
    public class Merge_Sort {
        public static void main(String [] args)
        {
            int [] a = {6,4,8,9,3,1,2,7,5};
            merge(a,0,a.length - 1);
            for(int y:a)
                System.out.print(y);
        }
    
        static void merge(int [] a, int i, int j)
        {
            int m = ((i + j) / 2);
            if(m == i || m == j)
            {
                if(a[i] > a[j])
                {
                    int t = a[j];
                    a[j] = a[i];
                    a[i] = t;
                }
            }
    
            else
            {
                merge(a,i,m);
                merge(a,m+1,j);
    
                int [] b = new int [j - i + 1];
                int l = i,k = m + 1,o=0;
                while (l <= m || k <= j)
                {
                    if (l <= m && k <= j) {
                        if (a[l] < a[k]) {
                            b[o] = a[l];
                            o++;
                            l++;
                        } else {
                            b[o] = a[k];
                            o++;
                            k++;
                        }
                    }
                    else if(l > m && k <= j)
                    {
                        b[o] = a[k];
                        k++;
                        o++;
                    }
                    else
                    {
                        b[o] = a[l];
                        l++;
                        o++;
    
                    }
    
                }
    
                for (int x = 0; x < b.length; x++)
                {
                    a[i] = b[x];
                    i++;
                }
    
            }
    
        }
    
    }
  • 相关阅读:
    Linux rpm 安装MySQL
    AOP 底层实现原理
    7 AOP
    HTTP 协议
    Oracle JDBC 标准连接实例
    Oracle JDBC 连接池
    Anaconda XGBoost安装
    Anaconda Spyder 导入自定义函数(模块)
    Hive常用sql
    决策树之信息增益计算模拟
  • 原文地址:https://www.cnblogs.com/lbrs/p/11925179.html
Copyright © 2011-2022 走看看