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(); } }