现在的位置: 首页 > 综合 > 正文

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

2018年08月29日 ⁄ 综合 ⁄ 共 1663字 ⁄ 字号 评论关闭
最近做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] + " ");
}
}

抱歉!评论已关闭.