zoukankan      html  css  js  c++  java
  • 常用算法值归并排序

    1、算法思想

    1. 将数据集合两分拆开
    2. 循环拆分至每组只剩一个为止
    3. 将拆分的数组进行排序组合
    4. 两两合并,直至合并成一个数组即排序完成
    • 算法思想参考下图

    2、代码示例

    package com.tianxiapai.admin.interfaces.commons;
    
    public class Demo {
        public static int[] array = {23, 11, 7, 29, 33, 59, 8, 20, 9, 3, 2, 6, 10, 44, 83, 28, 5, 1, 0, 36};
    
        /**
         * 归并排序:将数据集合两分拆开,直至最小之后两两排序合并
         */
        private static void mergeSort() {
            int[] temp = new int[array.length];
            mergeSort(temp, 0, array.length - 1);
        }
    
    
        /**
         * 查分数组,如果数组不能拆分了,则直接返回,拆分之后合并
         */
        private static void mergeSort(int[] temp, int start, int end) {
    
            if (start >= end) {
                return;
            }
    
            int mid = (start + end) / 2;
            mergeSort(temp, start, mid);
            mergeSort(temp, mid + 1, end);
            mergeArray(temp, start, mid + 1, end);
        }
    
    
        /**
         * 将数组array,以mid为中心,前后两个数组进行合并
         */
        private static void mergeArray(int[] temp, int start, int mid, int end) {
    
            // 定义指针下标,记录前后段是够可以继续移动
            int minA = start, minB = mid;
            for (int i = start; i <= end; i++) {
                if (minA >= mid || minB > end) {
                    // 如果a或者b用完了,则直接用对方的
                    if (minA >= mid) {
                        temp[i] = array[minB];
                        minB++;
                    } else {
                        temp[i] = array[minA];
                        minA++;
                    }
                } else {
                    // 都没用完则比较大小
                    if (array[minA] < array[minB]) {
                        temp[i] = array[minA];
                        minA++;
                    } else {
                        temp[i] = array[minB];
                        minB++;
                    }
                }
            }
    
            System.arraycopy(temp, start, array, start, end - start + 1);
            for (int i=0;i<array.length;i++) {
                System.out.print(array[i]+"   ");
            }
            System.out.println("");
        }
        
        public static void main(String[] args) {
            for (int i=0;i<array.length;i++) {
                System.out.print(array[i]+"   ");
            }
            System.out.println("");
            mergeSort();
            System.out.println("");
            for (int i=0;i<array.length;i++) {
                System.out.print(array[i]+"   ");
            }
        }
        
    }

    运行结果:

     3.时间复杂度

    • 时间复杂度O(nlogn)
  • 相关阅读:
    spring-mvc-继续学习
    springMVC学习
    spring-jdbc及事务
    Spring-MVC配置思路
    spring入门-注解的使用
    spring入门
    Spring MVC——数据校验(分组校验)
    Spring MVC——数据校验(数据回显)
    Spring MVC——数据检验步骤
    Spring MVC——参数装填方式
  • 原文地址:https://www.cnblogs.com/mr-wuxiansheng/p/9174534.html
Copyright © 2011-2022 走看看