zoukankan      html  css  js  c++  java
  • 排序系列 之 归并排序算法 —— 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];
            }
        }
    }

     结果展示:

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

  • 相关阅读:
    网络流
    第k短路(Dijkstra & A*)
    线段树(区间修改)
    线段树(单点修改)
    分块
    单调队列
    NOIP 2006 T2 金明的预算方案
    背包
    CH 6021 走廊泼水节
    关于数字序列匹配的一些问题(lis, lcs, lcis等)
  • 原文地址:https://www.cnblogs.com/snowcan/p/6590517.html
Copyright © 2011-2022 走看看