[原]归并排序的java递归实现

最近做java作业遇上了归并排序,备了个忘。
先说说归并排序:
    如果给定我们两个有序序列,那么我们可以在线性时间复杂度内将这两个有序列合并成一个有序列
    具体做法:
        1.开一个临时数组tempArray
        2.用三个变量(leftBegin, rightBegin, tempArrayPos)标记三个序列其实位置(tempArray与两个有序列)
        3.比较leftBegin与RightBegin标识的元素,较小的放到tempArray中。相关变量自增。
        4.最后要将tempArray中相应有序列复制回原数组相应位置。

    对于给定的无序列,如何构造两个有序列?有一个可以利用的特性:只有一个元素的序列显然是有序列。基于这个想法的归并排序是一个自底向上的过程。结合递归特性(一开始先深入到底部再返回)。整个代码实现如下:

public class mainclass 
{
public static void Merge(int dataSeq[], int tempArray[], int leftBegin, int rightBegin, int rightEnd)
{
int dataLen = rightEnd - leftBegin + 1;
int leftEnd = rightBegin - 1;
int tempArrayPos = leftBegin;
//比较合并, 较小的放到tempArray
while(leftBegin <= leftEnd && rightBegin <= rightEnd)
{
if(dataSeq[leftBegin] < dataSeq[rightBegin])
tempArray[tempArrayPos++] = dataSeq[leftBegin++];
else
tempArray[tempArrayPos++] = dataSeq[rightBegin++];
}
while(leftBegin <= leftEnd)//将左半数组剩下数据复制到tempArray
tempArray[tempArrayPos++] = dataSeq[leftBegin++];
while(rightBegin <= rightEnd)//将右半数组剩下数据复制到tempArray
tempArray[tempArrayPos++] = dataSeq[rightBegin++];
//将排序后元素复制回原数组
for(int i = 0; i < dataLen; i++, rightEnd--)
dataSeq[rightEnd] = tempArray[rightEnd];
}
public static void MergeSort(int dataSeq[], int tempArray[], int left, int right)
{
if(left >= right)//当数据只剩一个,显然
return;
int middle = (left + right) / 2;
MergeSort(dataSeq, tempArray, left, middle);//对数组前半段进行排序
MergeSort(dataSeq, tempArray, middle + 1, right);//对数组后半段进行排序
Merge(dataSeq, tempArray, left, middle + 1, right);//将两段有序序列合并
}
public static void MergeSort(int dataSeq[])
{
int [] tempArray = new int[dataSeq.length];
MergeSort(dataSeq, tempArray, 0, dataSeq.length - 1);
}
public static void main(String args[])
{
int [] dataSeq = {1, 1, 3, 5, 1, 0, 2, 67, 87, 98, 68, 95, 35, 234, 12, 3, 90, 90};
MergeSort(dataSeq);
for(int i = 0; i < dataSeq.length; i++)
System.out.print(dataSeq[i] + " ");
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值