排序算法之Java实现4——二路归并排序算法

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]);
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值