zoukankan      html  css  js  c++  java
  • 归并排序(分治法)

    import cn.idestiny.util.GeneratedArray;
    
    import java.util.Arrays;
    
    /**
     * @Auther: FAN
     * @Date: 2018/8/26 9:46
     * @Description:归并排序(分治法)
     * (分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)
     * 1) [5] [4] [8] [6] [7] [9] [3] [2]
     * 2) [4,5] [6,8] [7,9] [2,3]
     * 3) [4,5,6,8] [2,3,7,9]
     * 4) [2,3,4,5,6,7,8,9]
     *
     * **/
    public class MergeSort {
    
        public static void main(String[] args) {
    
            int[] arr = GeneratedArray.randomGeneratedArray(10,100,10000000);
            mergeSort(arr);
    
        }
    
        /**
         * 归并排序
         * @param arr 待排序数组
         */
        private static void mergeSort(int[] arr) {
            //准备数据,进入排序
            mergeSort(arr,0,arr.length-1);
    
        }
    
        /**
         * 递归拆分排序部分
         * @param arr 待排序数组
         * @param left 左边界
         * @param right 右边界
         */
        private static void mergeSort(int[] arr, int left, int right) {
            //如果left==right,则是[a],[b],[c]这种情况,所以不需要再拆分
            if(left>=right){
                return;
            }
            //计算每次拆分的中间位置
            int mid = (left+right)/2;
            //递归创建需要排序的左半边
            mergeSort(arr,left,mid);
            //递归创建需要排序的右半边
            mergeSort(arr,mid+1,right);
            //进入排序
            mergeSort(arr,left,mid,right);
        }
    
        /**
         * 归并排序的排序部分
         * @param arr 待排序数组
         * @param left 左边界
         * @param mid 中间标识
         * @param right 右边界
         */
        private static void mergeSort(int[] arr, int left, int mid, int right) {
            //复制一份数组用于扫描比较
            int[] tmp = Arrays.copyOfRange(arr,left,right+1);
            //初始化数据 i指向左半部分的起始索引位置l;j指向右半部分起始索引位置mid+1
            int i = left,j = mid+1;
            //排序
            for(int k = i;k<=right;k++){
                //如果左半部分已经全部处理完毕
                if(i>mid){
                    arr[k] = tmp[j-left];
                    j++;
                }
                //如果右半部分全部处理完毕
                else if(j>right){
                    arr[k] = tmp[i-left];
                    i++;
                }
                //左半部分所指元素 > 右半部分所指元素
                else if(tmp[i-left]>tmp[j-left]){
                    arr[k] = tmp[j-left];
                    j++;
                }
                //左半部分所指元素 《 右半部分所指元素
                else {
                    arr[k] = tmp[i-left];
                    i++;
                }
    
            }
        }
    
    
    }
  • 相关阅读:
    琴生(Jensen)不等式
    基本不等式
    集成学习之梯度提升树(GBDT)
    EM 算法原理
    FSMC驱动8位TFT
    GitHub 上有什么嵌入式方面的项目?
    在SPI_FLASH上建立文件系统
    百为STM32开发板教程——从LED流水灯到UCGUI手机界面
    STM32F1_外部NorFlash存储程序代码
    nor flash之擦除和写入
  • 原文地址:https://www.cnblogs.com/lfdestiny/p/9536666.html
Copyright © 2011-2022 走看看