一.思想:
将两个或者两个以上的有序表合并成一个新的有序表。设定两个指针,最初位置分别为两个已经排序序列的起始位置,然后比较两个指针所指向的元素,选择相对小的放入合并空间,并移动指针到下一位置,之后重复上述的步骤,直到达到某一序列的序列尾,最后将另一个序列的剩余所有元素直接复制到合并序列尾部。
二.例子:
比如5,4,6,2,3,1,首先找出中间索引,center=(left+right)/2=(0+5)/2=2;进行分组直到left>=right则分组停止
1.进行分组(left,center)为一组,(center+1,right)为一组,所以{5,4,6}为一组,{2,3,1}为一组。
2.再进行分组,对于{5,4,6},center=(0+2)/2=1,所以分为{5},{4,6},对于{2,3,1}同理分为{2},{3,1}.
3.然后进行归并排序,对{5}{4,6}进行归并排序,用两个指针的形式,归并后为{4,5,6},同理,对{2},{3,1}进行归并排序,排序后为{1,2,3}.
4.再对{4,5,6}{1,2,3}进行归并排序,归并后为{1,2,3,4,5,6}
三.代码实现:
public class MergeSort {
public static void main(String args[])
{
int num[] = {4,3,6,9887,5,3,2,3,1};
System.out.print("原始数据:");
print(num);
mergesort(num,0,8);
System.out.print("排序后数据:");
print(num);
}
public static void mergesort(int num[],int left,int right)
{
int center;
if(left >= right)
;
else
{
center = (left + right) / 2;
mergesort(num,left,center);
mergesort(num,center + 1,right);
merge(num,left,center,right);
}
}
public static void merge(int num[],int left,int center,int right)
{
int temp[] = new int[num.length];
int lindex = left;
int rindex = center + 1;
int tempindex = left;
while( (lindex <= center) && (rindex <= right) )
{
if(num[lindex] <= num[rindex])
{
temp[tempindex++] = num[lindex++];
}
else
{
temp[tempindex++] = num[rindex++];
}
}
while (rindex <= right)
{
temp[tempindex++] = num[rindex++];
}
while (lindex <= center)
{
temp[tempindex++] = num[lindex++];
}
while (left <= right)
{
num[left] = temp[left++];
}
}
public static void print(int num[])
{
int i;
for(i = 0; i < num.length; ++i)
{
System.out.print(num[i]+" ");
}
System.out.print("\n");
}
}
四.复杂度与应用:
时间复杂度:O(nlogn) 空间复杂度:O(n) 是稳定的排序法
五.参考资料:
1.追竹的博客:http://blog.csdn.net/apei830/article/details/6591632
2.百度百科-归并排序:http://baike.baidu.com/view/90797.htm?fromId=19000&fr=wordsearch
六:相关排序代码下载:包含(冒泡排序,桶排序,堆排序,插入排序,归并排序,快速排序,基数排序,选择排序,希尔排序)
免积分下载地址: http://download.csdn.net/detail/u014077165/7185895