归并排序
核心思想:两个有序子序列的合并
将小的有序序列逐步合并成大的有序序列,直到完成排序
时间复杂度:O(N*logN)
递归算法
class Sort{
int N;
int a[] = new int[100005];
int tmp[] = new int[100005];
public void mergeSort(int left,int right){
if(left<right){
int center = (left+right)>>1;
mergeSort(left,center);
mergeSort(center+1,right);
merge(left,center,right);
}
}
private void merge(int left,int center,int right){//merge two sorted subsequences
int s1=left;
int s2=center+1;
int now=left;
while (s1<=center&&s2<=right){
if(a[s1]<=a[s2])
tmp[now++]=a[s1++];
else
tmp[now++]=a[s2++];
}
while (s1<=center)
tmp[now++]=a[s1++];
while (s2<=right)
tmp[now++]=a[s2++];
for (int i = left; i <=right ; i++)
a[i]=tmp[i];
}
}
非递归算法
class Sort{
int N;
int a[] = new int[100005];
int tmp[] = new int[100005];
public void mergeSort(int left,int right){
int length=1,i;
while (length<N){
for (i = 0; i <= N-2*length ; i+=2*length)
merge(i,i+length-1,i+2*length-1);
if(i+length<N)
merge(i,i+length-1,N-1);
length<<=1;
}
}
private void merge(int left,int center,int right){//merge two sorted subsequences
int s1=left;
int s2=center+1;
int now=left;
while (s1<=center&&s2<=right){
if(a[s1]<=a[s2])
tmp[now++]=a[s1++];
else
tmp[now++]=a[s2++];
}
while (s1<=center)
tmp[now++]=a[s1++];
while (s2<=right)
tmp[now++]=a[s2++];
for (int i = left; i <=right ; i++)
a[i]=tmp[i];
}
}