//过程示例

/*

[12]

[23]

---------------------

合并[12]and[23]得[12, 23]

---------------------

[21]

---------------------

合并[12, 23]and[21]得[12, 21, 23]

---------------------

[12]

[23]

---------------------

合并[12]and[23]得[12, 23]

---------------------

---------------------

合并[12, 21, 23]and[12, 23]得[12, 12, 21, 23, 23]

---------------------

[14]

[54]

---------------------

合并[14]and[54]得[14, 54]

---------------------

[64]

[43]

---------------------

合并[64]and[43]得[43, 64]

---------------------

---------------------

合并[14, 54]and[43, 64]得[14, 43, 54, 64]

---------------------

---------------------

合并[12, 12, 21, 23, 23]and[14, 43, 54, 64]得[12, 12, 14, 21, 23, 23, 43, 54, 64]

---------------------

[12, 12, 14, 21, 23, 23, 43, 54, 64]

*/

package com.example.sort;


import java.util.Arrays;


public class HebingSort {

public static void main(String[] args) {

int[] arr = new int[]{12,23,21,12,23,14,54,64,43};

System.out.println(Arrays.toString(fenChai(arr)));

}

//分拆

private static int[] fenChai(int[] arr) {

// TODO Auto-generated method stub

if(arr.length==1){

System.out.println(Arrays.toString(arr));

return arr;

}

int length1 = (int)Math.ceil((double)arr.length/2);//进1

int[] arr1 = new int[length1];

int[] arr2 = new int[arr.length-length1];

for(int i=0;i<arr.length;i++){

if(i<length1){

arr1[i] = arr[i];

}else{

arr2[i-length1] = arr[i];

}

}

int[] he1=fenChai(arr1);

int[] he2=fenChai(arr2);

        return heBing(he1,he2);

}

//合并

private static int[] heBing(int[] arr1,int[] arr2) {

int arr[]  = new int[arr1.length+arr2.length];

int indexOfArr1=0;

int indexOfArr2=0;

for(int i=0;i<arr.length;i++){

if(indexOfArr1==arr1.length){

arr[i] = arr2[indexOfArr2];

indexOfArr2++;

continue;

}

if(indexOfArr2==arr2.length){

arr[i] = arr1[indexOfArr1];

indexOfArr1++;

continue;

}

if(arr1[indexOfArr1]<arr2[indexOfArr2]){

arr[i] = arr1[indexOfArr1];

indexOfArr1++;

}else{

arr[i] = arr2[indexOfArr2];

indexOfArr2++;

}

}

System.out.println("---------------------");

System.out.println("合并"+Arrays.toString(arr1)+"and"+Arrays.toString(arr2)+"得"+Arrays.toString(arr));

System.out.println("---------------------");

return arr;

}

}