package com.study.sort;
import java.util.Arrays;
/**
* 参考:https://www.cnblogs.com/chengxiao/p/6194356.html
*8 4 5 7 1 3 6 2
*1、将原始数组分割为最小数组序列,先将子序列进行排序,然后向上归并;
*
* mergeItemStart==>:startIndex:0 midIndex:0 endIndex:1 handLen:2
* array: ->8 4 5 7 1 3 6 2
* mergeItemIng=================
* temp: ->4 8
* array: ->4 8 5 7 1 3 6 2
* mergeItemEnd=================
*
*
* mergeItemStart==>:startIndex:2 midIndex:2 endIndex:3 handLen:2
* array: ->4 8 5 7 1 3 6 2
* mergeItemIng=================
* temp: ->5 7
* array: ->4 8 5 7 1 3 6 2
* mergeItemEnd=================
*
*
* mergeItemStart==>:startIndex:0 midIndex:1 endIndex:3 handLen:4
* array: ->4 8 5 7 1 3 6 2
* mergeItemIng=================
* temp: ->4 5 7 8
* array: ->4 5 7 8 1 3 6 2
* mergeItemEnd=================
*
*
* mergeItemStart==>:startIndex:4 midIndex:4 endIndex:5 handLen:2
* array: ->4 5 7 8 1 3 6 2
* mergeItemIng=================
* temp: ->1 3
* array: ->4 5 7 8 1 3 6 2
* mergeItemEnd=================
*
*
* mergeItemStart==>:startIndex:6 midIndex:6 endIndex:7 handLen:2
* array: ->4 5 7 8 1 3 6 2
* mergeItemIng=================
* temp: ->2 6
* array: ->4 5 7 8 1 3 2 6
* mergeItemEnd=================
*
*
* mergeItemStart==>:startIndex:4 midIndex:5 endIndex:7 handLen:4
* array: ->4 5 7 8 1 3 2 6
* mergeItemIng=================
* temp: ->1 2 3 6
* array: ->4 5 7 8 1 2 3 6
* mergeItemEnd=================
*
*
* mergeItemStart==>:startIndex:0 midIndex:3 endIndex:7 handLen:8
* array: ->4 5 7 8 1 2 3 6
* mergeItemIng=================
* temp: ->1 2 3 4 5 6 7 8
* array: ->1 2 3 4 5 6 7 8
* mergeItemEnd=================
* ============end
* 1 2 3 4 5 6 7 8
*/
public class MergeSort extends BaseSort{
public static void main(String[] args) {
isPrint=true;
int len=10;
// int []array=genArray(len);
int []array=new int[]{8,4,5,7,9,1,3,6,2};
p(array);
mergeSort(array,0,array.length-1);
System.out.println("============end");
p(array);
}
public static void mergeSort(int array[],int startIndex,int endIndex){
if(startIndex<endIndex){
int mid=(startIndex+endIndex)/2;
mergeSort(array,startIndex,mid);
mergeSort(array,mid+1,endIndex);
merge(array,startIndex,mid,endIndex);
}else {
//只有相等的情况
}
}
/**
*
*
* @param array 原始数组
* @param startIndex 该次排序数组在原数组中的起始下标
* @param midIndex 该次排序数组在原数组中的mid下标
* @param endIndex 该次排序数组在原数组中的终止下标
*/
public static void merge(int array[],int startIndex,int midIndex,int endIndex){
// 每次新建一个临时数组,将左数组和有数组里的数据按照顺序填充到临时数组temp;
int []temp =new int[endIndex-startIndex+1];
System.out.println("\n\nmergeItemStart==>:startIndex:"+startIndex+" midIndex:"+midIndex+" endIndex:"+endIndex +" handLen:"+temp.length);
p("array:",array);
System.out.println("mergeItemIng=================" );
int i=startIndex;int j=midIndex+1;
int t=0;
while(i<=midIndex&&j<=endIndex){
if(array[i]<array[j]){
temp[t++]=array[i++];
}else {
temp[t++]=array[j++];
}
}
//需考虑左数组和右数组不一样长的情况;
while (i<=midIndex){
temp[t++]=array[i++];
}
while (j<=endIndex){
temp[t++]=array[j++];
}
t=0;
//将排序好的临时数组拷贝到原始数组
while (startIndex<=endIndex){
array[startIndex++]=temp[t++];
}
p("temp:",temp);
p("array:",array);
System.out.println("mergeItemEnd=================" );
}
}
归并排序
最新推荐文章于 2022-12-07 18:26:47 发布