zoukankan      html  css  js  c++  java
  • 归并排序

    1.归并排序简介

    归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略

    分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之


    2.归并排图解


    3.代码

    public class MergeSort {
        public static void main(String[] args) {
            int[] arr = {8,4,5,3,7,9,6,2,1};
            int[] temp = new int[arr.length];
            mergeSort(arr,0,arr.length-1,temp);
            System.out.println(Arrays.toString(arr));
        }
    
        /**
         * 分+合
         * 利用栈,将每一次分的数组进行排序后合并
         * @param arr
         * @param left
         * @param right
         * @param temp
         */
        public static void mergeSort(int[] arr,int left,int right,int[] temp){
            if (left<right){
                int mind = (left+right)/2;//中间索引
                //向左递归分解
                mergeSort(arr,left,mind,temp);
                //向左递归分解
                mergeSort(arr,mind+1,right,temp);
                //合并
                merge(arr,left,right,mind,temp);
            }
        }
        /**
         *合并部分
         * @param arr 待排序数组
         * @param left 左边有序序列的初始索引
         * @param right 左边有序序列的最后一个值的索引
         * @param mind arr的中间索引
         * @param temp 做中转的数组
         */
        public static void merge(int[] arr,int left,int right,int mind,int[] temp){
            int i = left;//初始化i:左边有序序列的初始索引
            int j = mind + 1;//初始j:右边有序序列的初始索引
            int t=0;//t指向temp的当前位置,也就是要存入数据的位置
    
            //把左右两个序列的数据按照规则天才到temp数组,直到两个数组有一个处理完为止
            //i<=mind&&j<=right:表示左右两边都没有遍历完
            while (i <= mind && j <= right){
                //将小的数填充到temp数组索引为t的位置
                if(arr[i] <= arr[j]){
                    temp[t] = arr[i];
                    t += 1;
                    i += 1;
                }else {
                    temp[t] = arr[j];
                    t += 1;
                    j += 1;
                }
            }
            //把剩余数组依此填充到temp数组
            while (i<=mind){//左边有剩余
                temp[t] = arr[i];
                i += 1;
                t += 1;
            }
            while (j<=right){//右边有剩余
                temp[t] = arr[j];
                j += 1;
                t += 1;
            }
    
            //将temp数组拷贝到arr
            t=0;
            int tempLeft = left;
            while (tempLeft<=right){
                arr[tempLeft] = temp[t];
                t += 1;
                tempLeft += 1;
            }
        }
    }
  • 相关阅读:
    树型表的设计 上海
    FTP通讯封装 上海
    线程淡写 上海
    TCP通讯故障 上海
    设计模式引导 上海
    初试Delegate 上海
    c# 扫描端口 上海
    攻读计算机研究生的看法(转载) 上海
    挖掘表字段中的汉字 上海
    新生活运动 上海
  • 原文地址:https://www.cnblogs.com/isalo/p/13095236.html
Copyright © 2011-2022 走看看