public class MergeSort {
public void MergeSort(int a[],int left,int right){
if(left>=right) //递归出口
return;
int mid=(left+right)/2;
MergeSort(a,left,mid); //排序左边
MergeSort(a,mid+1,right); //排序右边
Merge(a,left,mid,right); //合并左右
}
public void Merge(int a[],int left,int mid,int right) //合并函数
{
int i=left,j=mid+1,k=0; //i,j,k分别用于记录左边数组和右边数组还有暂存数组的下标
int temp[]=new int[right-left+1]; //申请空间
while(i<=mid&&j<=right){ //当左右边数组都没有遍历到末尾
if(a[i]>a[j]) //左边比右边大的情况
temp[k++]=a[j++];
else
temp[k++]=a[i++];
}
for(;k<temp.length;k++){ //遍历出来后,有一组遍历到末尾,那组的
//数值都赋值到temp中了,现在对另一个未完成的赋值
if(i==mid+1) //右边未完成的情况
{
temp[k]=a[j++];
}
else
temp[k]=a[i++];
}
for(int q=left;q<=right;q++) //把temp赋值给a这里注意q和边界,
{
a[q]=temp[q-left];
}
}
public static void main(String[] args) {
int a[] = new int[100];
for (int i = 0; i < a.length; i++) //产生0-10001的数组
a[i] = (int) (Math.random() * 1000 + 1);
new MergeSort().MergeSort(a, 0, a.length - 1);
for (int i = 0; i < a.length; i++)
System.out.println(a[i]);
}
}
不理解的可以看这篇文章详细解释归并排序:
递归的过程稍微有点难理解,可以看文章中那张图就很容易理解啦
https://blog.csdn.net/weixin_41666747/article/details/102480482
空间复杂度是O(n) 时间复杂度O(nlogn) 稳定算法
上面合并也就是Merge函数过程有点冗余,是我自己想的,参考网上一段代码也可以写成这种形式
public void Merge(int a[],int left,int mid,int right) //合并函数
{
// int i=left,j=mid+1,k=0;
int temp[]=new int[right-left+1];
for(int i=left;i<=right;i++)
temp[i-left]=a[i];
int i=left,j=mid+1,k=0;
for(int p=left;p<=right;p++){
if(i>mid&&j<=right) //左边数组已经赋值完的情况
{
a[p]=temp[j-left];
j++;
}
else if(j>right&&i<=mid) //右边数组已经赋值完的情况
{
a[p]=temp[i-left];
i++;
}
else if(temp[i-left]<=temp[j-left]) //左边小于右边数组的情况
{ a[p]=temp[i-left];i++;
}
else { //右边小于左边
a[p]=temp[j-left];j++;
}
}
}