zoukankan      html  css  js  c++  java
  • 归并排序(非递归)

    package com.dtg.javatest;
    
    public class Main01 {
    
        public static int count = 0;
    
        public static void main(String[] args) {
            int[] arr = {1, 9, 3, 22, 10, 8, 4, 5, 99, 31, 3332, 2, 19, 322, 544, 29, 103, 56, 28};
            System.out.println(arrstr(arr));
    
            sort1(arr);
    
            System.out.println(arrstr(arr));
    
            System.out.println("count:" + count);
        }
    
    
        
        //非递归
        public static void sort1(int[] arr) {
    
            if (arr == null || arr.length < 2) { //数量少于2 ,则为0或1时,直接返回该数组
                return;
            }
    
            int AL = 0; //数组最左边
            int AR = arr.length - 1;//数组最右边
    
            //已知步长和起始位置,可以将原数组拆分为多个子数组,每个子数组可分成左右两个有序数组。        int curstartindex = 0;
            int steplen = 1;
    
            //步长
            //以下逻辑主要是判断能否拆成一对左右数组, 左数组个数可以比右数组多。 但右数组不能为0个。
            while (steplen <= AR) { //如果步长为AR ,则M坐标为0+AR-1, 右数据起始点为M+1为AR 仍可以分成两数组。 如果步长为AR+1,则不能分出两数组
    
                int L = curstartindex;//最左边
    
                int M = curstartindex + steplen - 1;//中间
    
                int R = (curstartindex + steplen * 2 - 1);//最右边
                R = R < AR ? R : AR;//最右
    
                if (L >= AR || M >= AR) {
                    //L>=AR表示,L已经是原数组最大index, 这样右子数组 是空,L数据与右空数组全并,最后也是L ,所以跳出当前循环
                    //M>=AR表示,M已经是原数组最大index, 这样右子数组 是空,所以跳出当前循环
                    curstartindex = 0;
                    steplen = steplen * 2;
                    System.out.println(arrstr(arr));
                    continue;
                }
    
                merge(arr, L, M, R); //拆成两组[L,M] [M+1,R]进行合并排序
                curstartindex = R + 1;//操作完之后, 重新进行当轮下一对左右子组的拆解,合并
    
            }
    
        }
    
      
    
        public static void merge(int[] arr, int L, int M, int R) {
    
            String baselog = "merge(" + L + "," + M + "]," + R + ") " + "{" + arrstr(arr, L, M, R) + "}";
            int[] result = new int[R - L + 1];
    
            int LP = L;
            int RP = M + 1;
            System.out.println(baselog + "LP:" + LP + ",RP:" + RP);
    
            int i = 0;
            while (LP <= M && RP <= R) {
                count++;
                result[i++] = arr[LP] < arr[RP] ? arr[LP++] : arr[RP++];
            }
    
            while (LP <= M) {
                count++;
                result[i++] = arr[LP++];
            }
    
            while (RP <= R) {
                count++;
                result[i++] = arr[RP++];
            }
            for (int k = L; k <= R; k++) {
                count++;
                arr[k] = result[k - L]; //result数组的起始位置0 对应原数据是L,原数组 比 result数组多了L的偏移
            }
            //System.out.println(baselog+"arrstr(arr):"+arrstr(arr));
            System.out.println(baselog + "arrstr(result):" + arrstr(result));
    
        }
    
        public static String arrstr(int[] arr) {
            StringBuffer sb = new StringBuffer();
    
            for (int i : arr) {
                sb.append(String.valueOf(i)).append(" ");
            }
            return sb.toString();
        }
    
        public static String arrstr(int[] arr, int L, int M, int R) {
            StringBuffer sb = new StringBuffer();
    
            for (int i = L; i <= R; i++) {
                sb.append(String.valueOf(arr[i])).append(" ");
                if (i == M) {
                    sb.append(" M ");
                }
            }
            return sb.toString();
        }
    }
  • 相关阅读:
    codevs 3249 搭积木
    BSGS算法+逆元 POJ 2417 Discrete Logging
    POJ 1012 Joseph
    SPFA cojs 176. [USACO Feb07] 奶牛聚会
    素数筛 codevs 1675 大质数 2
    单片机软件proteus的汉化步骤
    直升机和固定翼实操期末考试
    二、万用表使用方法
    拉伸切除
    拔模
  • 原文地址:https://www.cnblogs.com/datangguott/p/14269389.html
Copyright © 2011-2022 走看看