package
sort.algorithm;
import
java.util.Arrays;
//二路归并排序主要分为
//分割和合并
public
class
MergeSort {
public
static
void
main(String[] args) {
int
data[] = {
2
,
6
,
10
,
3
,
9
,
80
,
1
,
16
,
27
,
20
};
mergeSort(data,
0
,data.length-
1
);
//直接打印
System.out.println(Arrays.toString(data));
}
//二路归并的分割处理
public
static
void
mergeSort(
int
[] array,
int
start,
int
end)
{
if
(start<end)
{
//划分为两部分,每次两部分进行归并
int
mid=(start+end)/
2
;
//两路归并
//先递归处理每一个部分
mergeSort(array,start,mid);
mergeSort(array,mid+
1
,end);
//然后将已经排序好的,两两归并排序再进行合并处理
merge(array,start,mid,mid+
1
,end);
}
}
//二路归并两个部分的时候进行排序
public
static
void
merge(
int
[] array,
int
start1,
int
end1,
int
start2,
int
end2)
{
int
i=start1;
//左路起始索引
int
j=start2;
//右路起始索引
int
k=
0
;
//归并的时候,会将两个数组数据按照大小输入到一个临时数组中
//建立临时长度为两个子列表长度的数组
int
[] temp=
new
int
[end2-start1+
1
];
//循环遍历,按顺序找出两个表中的最小数据依次放入临时表中
//注意此时左路和右路已经是有序的了。
//当一路有一个小的,则会索引加1,继续喝另外一路的上次索引进行比较
while
(i<=end1&&j<=end2)
{
//这里确定归并的次序大小
if
(array[i]>array[j])
temp[k++]=array[j++];
else
temp[k++]=array[i++];
}
//把剩下的元素放入临时数组中,只有一路的
while
(i<=end1)
temp[k++]=array[i++];
while
(j<=end2)
temp[k++]=array[j++];
k=start1;
for
(
int
item:temp)
array[k++]=item;
}
}