算法描述: 对n个元素进行排序
算法思想: 将待排序元素分成大小大致相同的2个子集合,分别对2个集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合.
实现程序:
/**
* Copyright (c) 2011 Trusted Software and Mobile Computing(TSMC)
* All right reserved.
*
* Created on 2011
*
* http://jarg.iteye.com/
*
*/
// Authors: Jarg Yee <yeshaoting@gmail.com>
/**
* 合并排序,以小到大排序
*/
public class MergeSort
{
/** 待排序的数组 */
private static int[] value = {2,1,4,3,6,5,8,7,9,0};
/** for debugging. */
public static void main(String[] args)
{
mergeSort(0,value.length-1);
display();
}
/** 合并排序 */
private static void mergeSort(int beginIndex,int endIndex)
{
if(beginIndex<endIndex)
{
int mid = (endIndex+beginIndex)/2; // 分割中点
mergeSort(beginIndex,mid); // 分割后左段
mergeSort(mid+1,endIndex); // 分割后右段
merge(beginIndex,endIndex); // 合并数组
}
// beginIndex==endIndex的情况不用处理
}
/** 合并段 */
private static void merge(int beginIndex,int endIndex)
{
/* 临时保存排好序的数组 */
int[] temp = new int[endIndex-beginIndex+1];
/* 段分界点 */
int mid = (beginIndex + endIndex)/2;
int i=beginIndex, j=mid+1, k=0;
while(i<=mid&&j<=endIndex)
{
/* 比较元素大小,按大小依次放入temp中 */
if(value[i]>=value[j])
{
temp[k++] = value[j++]; // 第二段元素加入temp
}
else
{
temp[k++] = value[i++]; // 第一段元素加入temp
}
}
/* 第一段数组索引i大于段最大标号 */
if(i>mid)
{
/* 把第二段未放入temp中的元素依次放入temp */
for(int t=j;t<=endIndex;t++)
{
temp[k++] = value[t];
}
}
else
{
/* 把第一段未放入temp中的元素依次放入temp */
for(int t=i;t<=mid;t++)
{
temp[k++] = value[t];
}
}
/* 把临时保存的已经排好序的数组值覆盖原始值 */
for(int t=0;t<temp.length;t++)
{
value[beginIndex+t] = temp[t];
}
//System.out.println("beginIndex:" + beginIndex + "\tendIndex:" + endIndex);
}
/** 显示排序后的结果 */
private static void display()
{
for(int i=0;i<value.length;i++)
System.out.println("value[" + i + "]=" + value[i]);
}
}