步骤:1.递归拆分,并对两个拆分的数组进行排序
2.合并两个有序数组
时间复杂度为O(nlogn)
原理图:
代码实现:
package suanfa;
public class Merge {
private static int[] temp;
public static void main(String[] args) {
int[] a={1,7,8,9,2,3,4,5};
Merge.sort(a, 0, a.length-1);
for(int i=0;i<a.length;i++)
{
System.out.print(a[i]+",");
}
}
static void sort( int[] a,int first,int last)
{
int mid=(last+first)/2; //以mid为中心 拆分两个数组
if(last>first) //递归条件
{
sort(a,first,mid);//排序左边数组
sort(a,mid+1,last);//排序右边数组
merge(a,first,mid,last);//合并两个数组
}
}
static void merge(int[] a,int first,int mid,int last)
{
int[] temp=new int[a.length];//创建临时数组
int i=first,j=mid+1;//定义左指针和右指针
for(int k=first;k<=last;k++)
{
temp[k]=a[k];
}
for(int k=first;k<=last;k++)
{
if(i>mid)
a[k]=temp[j++];
if(j>last)
a[k]=temp[i++];
else if(less(temp[i],temp[j]))
a[k]=temp[i++];
else a[k]=temp[j++];
}
}
static boolean less(int a,int b)
{
return a<b;
}
static void exch(int[] a,int i,int j){
int temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}
java代码:
package com.casm.leetcode;
public class Solution {
public static void main(String[] args) {
Solution test=new Solution();
int[] num = new int[] {100,4,200,1,3,2,43,28,41,33};
int[] temp = new int[num.length];
test.Mergesort(num, temp, 0, num.length-1);
for(int i=0;i<num.length;i++)
{
System.out.println(num[i]);
}
}
public void Mergesort (int[] num, int temp[],int left, int right) {
int mid;
if(left<right)
{
mid=(right+left)/2;
Mergesort(num, temp, left, mid);
Mergesort(num, temp, mid+1, right);
Merge(num, temp, left, mid, right);
}
}
public void Merge(int[] num, int temp[],int left, int mid, int right) {
int i,j,pos,leftend;
i=left;
leftend=mid;
j=mid+1;
pos=left;
while(i<=leftend&&j<=right)
{
if(num[i]<num[j])
{
temp[pos++]=num[i++];
}
else
{
temp[pos++]=num[j++];
}
}
while(i<=leftend)
{
temp[pos++]=num[i++];
}
while(j<=right)
{
temp[pos++]=num[j++];
}
for(int k=left;k<=right;k++)
{
num[k]=temp[k];
}
}
}