zoukankan      html  css  js  c++  java
  • java方式实现归并排序

    一、基本思想

    归并排序是建立在归并操作上的一种排序算法,该算法是采用分治法的一个典型应用。具体操作如下:所谓的分治就是分而治之,以一分为二的原则,先把序列平均分解成二个左右子序列,然后递归左右二个子序列进行分解操作,直到得到的子序列为一个元素时,然后两两合并子序列并排序,然后递归以上合并操作,直到合并完整个序列。归并排序的平均时间复杂度为O(nlog2n),归并排序需要开辟一个数组空间,所有归并排序空间复杂度为0(n)。归并排序是稳定的排序。

    二、图解

    三、代码实现

    ublic class JavaSort {
        public static void main(String[] args) {
            int a [] =new int []{6,5,3,1,8,7,2,4};
            System.out.println("排序前的数组:"+Arrays.toString(a));
            mergeSort(a, 0, a.length-1);
            System.out.println("排序后的数组:"+Arrays.toString(a));
        }
        
        /**
         * 
         * @param ary 未排序的序列
         * @param left 序列起始索引
         * @param right 序列末尾索引
         */
        public static void mergeSort(int[] ary, int left, int right) {
            if(null == ary) {
                return;
            }
            
            if(left < right) {
                //找中间位置进行划分
                int mid = (left+right)/2;
                //对左子序列进行递归分解
                mergeSort(ary, left, mid);
                //对右子序列进行递归分解
                mergeSort(ary, mid+1, right);
                // 进行递归并归排序
                merge(ary, left, mid, right);
            }
        }
        
        /**
         * 进行归并
         * @param ary  未排序的序列
         * @param left 序列起始索引
         * @param mid 序列中间索引
         * @param right 序列末尾索引
         */
        private static void merge(int[] ary, int left, int mid, int right) {
            int[] tempArr = new int[ary.length];
            int leftStart = left;
            int rightStart = mid+1;
            int tempIndex = left;
            
            while(leftStart <= mid && rightStart <= right) {
                if(ary[leftStart] < ary[rightStart]) {
                    tempArr[tempIndex++] = ary[leftStart++];
                } else {
                    tempArr[tempIndex++] = ary[rightStart++];
                }    
            }
            
            while(leftStart <= mid) {
                tempArr[tempIndex++] = ary[leftStart++];
            }
            
            while(rightStart <= right) {
                tempArr[tempIndex++] = ary[rightStart++];
            }
            
            while(left <= right) {
                ary[left] = tempArr[left++];
            }
        }
    }

    代码运行:

  • 相关阅读:
    java基本类型和引用做形参传递
    新阶段新开始
    给网页中的button加动画效果
    数组对象常用的几个函数总结
    微信小程序使用页面栈改变上一页面的数据
    pc端和移动端的“窗口”(viewport)故事(part1)
    js的for循环中出现异步函数,回调引用的循环值总是最后一步的值?
    macOS Sierra 如何安装任何来源的软件
    Box-shadow制作漂亮的外阴影输入框
    button标签与input type=button标签使用的差异
  • 原文地址:https://www.cnblogs.com/shareAndStudy/p/12466394.html
Copyright © 2011-2022 走看看