package com.sorts;
public class MergeSort {
/**
* 合并有序序列start~middle和middle~end到一个有效序列
* 数组是a[start-1~middle-1]与a[middle~end-1]两个子序列
* 时间复杂度为:
* 最好O(nlogn);平均O(nlogn);最坏O(nlogn)
* 空间复杂度为: O(n)
* @param a
* @param start
* @param middle
* @param end
*/
public static void merge(int a[], int start, int middle, int end){
int i,j,n1,n2;
n1 = middle-start+1;
n2 = end-middle;
int[] L = new int[n1];
int[] R = new int[n2];
for(i=0;i<n1;i++){
L[i] = a[start+i-1];//从start-1位置开始取值,最终到middle-1位置的取值//注意赋值到start起点基数
}
for(j=0;j<n2;j++){
R[j] = a[middle+j];//从middle位置开始取值,最终到end-1位置的取值
}
for(i=0,j=0; i<n1&&j<n2; )
{
if(L[i] > R[j]){
a[start+i+j-1] = R[j];//注意赋值到start起点基数
j++;
}else{
a[start+i+j-1] = L[i];//注意赋值到start起点基数
i++;
}
}
//剩余一个序列的尾
while(j<n2){a[start+i+j-1] = R[j];j++;}//注意赋值到start起点基数
while(i<n1){a[start+i+j-1] = L[i];i++;}//注意赋值到start起点基数
}
/**
* 归并排序算法递归调用左右子序列,再合并左右有序的子序列
* @param a
* @param p
* @param q
*/
public static void mergesort(int[] a, int p, int q){
if(p<q){
int s = (p+q)/2;
mergesort(a, p, s);//归并排序左序列
mergesort(a, s+1, q);//归并排序右序列
merge(a, p, s, q);//合并左右有序子序列
}
}
public static void main (String args[])
{
int i;
int[] a = {6,2,5,4,7,55,1,0,666};
//merge(a, 1, 1, 2);
mergesort(a, 1, a.length);
for(i=0; i<a.length; i++){
System.out.println("a["+i+"]="+a[i]);
}
}
}
public class MergeSort {
/**
* 合并有序序列start~middle和middle~end到一个有效序列
* 数组是a[start-1~middle-1]与a[middle~end-1]两个子序列
* 时间复杂度为:
* 最好O(nlogn);平均O(nlogn);最坏O(nlogn)
* 空间复杂度为: O(n)
* @param a
* @param start
* @param middle
* @param end
*/
public static void merge(int a[], int start, int middle, int end){
int i,j,n1,n2;
n1 = middle-start+1;
n2 = end-middle;
int[] L = new int[n1];
int[] R = new int[n2];
for(i=0;i<n1;i++){
L[i] = a[start+i-1];//从start-1位置开始取值,最终到middle-1位置的取值//注意赋值到start起点基数
}
for(j=0;j<n2;j++){
R[j] = a[middle+j];//从middle位置开始取值,最终到end-1位置的取值
}
for(i=0,j=0; i<n1&&j<n2; )
{
if(L[i] > R[j]){
a[start+i+j-1] = R[j];//注意赋值到start起点基数
j++;
}else{
a[start+i+j-1] = L[i];//注意赋值到start起点基数
i++;
}
}
//剩余一个序列的尾
while(j<n2){a[start+i+j-1] = R[j];j++;}//注意赋值到start起点基数
while(i<n1){a[start+i+j-1] = L[i];i++;}//注意赋值到start起点基数
}
/**
* 归并排序算法递归调用左右子序列,再合并左右有序的子序列
* @param a
* @param p
* @param q
*/
public static void mergesort(int[] a, int p, int q){
if(p<q){
int s = (p+q)/2;
mergesort(a, p, s);//归并排序左序列
mergesort(a, s+1, q);//归并排序右序列
merge(a, p, s, q);//合并左右有序子序列
}
}
public static void main (String args[])
{
int i;
int[] a = {6,2,5,4,7,55,1,0,666};
//merge(a, 1, 1, 2);
mergesort(a, 1, a.length);
for(i=0; i<a.length; i++){
System.out.println("a["+i+"]="+a[i]);
}
}
}