• 排序系列 之 归并排序算法 —— Java实现


     基本思想:

      归并排序法是分治法的典型实例,分为分割和归并两部分。

      把一个数组分为大小相近的子数组(分割),分别把子数组排好序后,通过合成一个大的排好序的数组(归并)。

     实例:

       先分割成每个子序列只有一个元素,然后再两两归并。

      

     归并排序是稳定的排序算法,时间复杂度为:O(NlogN).

     Java实现:

    package sort;
    
    public class MergeSort {
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            new MergeSort().run();
        }
        public void run(){
            
            int a[] = {3,1,5,7,2,4,9,6};
            int len = a.length;
            sort(a,0,len-1);
            for(int i=0;i<len;i++){
                System.out.print(a[i]+" ");
            }
        }
        /**
         * 归并排序  稳定的
         * 基本思想
         * 将两个或两个以上有序表合并成一个新的有序表
         * 即把待排序序列分成若干个子序列,每个子序列是有序的,然后在把有序子序列合并为整体有序序列
         */
        public void sort(int arr[],int low,int high){
            if(low == high){
                return;
            }
            int mid = (low+high)/2;
            if(low<high){
                /**
                 * 对左边排序
                 */
                sort(arr,low,mid);
                /**
                 * 对右边排序
                 */
                sort(arr,mid+1,high);
                /**
                 * 左右归并
                 */
                merge(arr,low,mid,high);
            }
        }
        public void merge(int[] arr,int low,int mid,int high){
            int [] temp = new int[high-low+1];
            /**
             * 左指针
             */
            int i = low;
            /**
             * 右指针
             */
            int j = mid+1;
            int k=0;
            /**
             * 先把较小的数移到新数组中
             */
            while(i<=mid && j<=high){
                if(arr[i]<arr[j]){
                    temp[k++] = arr[i++];
                }else{
                    temp[k++] = arr[j++];
                }
            }
            /**
             * 把左边剩余的数移入新数组
             */
            while(i<=mid){
                temp[k++] = arr[i++];
            }
            /**
             * 把右边剩余的数移入新数组
             */
            while(j<=high){
                temp[k++] = arr[j++];
            }
            /**
             * 用新数组中的数覆盖arr数组
             */
            for(int k2=0;k2<temp.length;k2++){
                arr[k2+low] = temp[k2];
            }
        }
    }

     结果展示:

      (本文仅供学习交流,如有更好的思路,欢迎留下意见供大家探讨学习~) 

  • 相关阅读:
    阿里双11,如何实现每秒几十万的高并发写入
    记住:永远不要在 MySQL 中使用 UTF-8
    史上最烂的项目:苦撑 12 年,600 多万行代码
    除了不要 SELECT * ,使用数据库还应知道的11个技巧!
    厉害了,为了干掉 HTTP ,Spring团队又开源 nohttp 项目!
    请停止学习框架
    基于 MySQL 主从模式搭建上万并发的系统架构
    JS获取节点
    JS函数
    JS
  • 原文地址:https://www.cnblogs.com/snowcan/p/6590517.html
Copyright © 2020-2023  润新知