合并排序
1.基本设计思想:将原始数组A[0...n-1]中的元素分成两个子数组:A1[0,n/2]和A2[n/2+1,n-1].分别对这两个子数组单独排序,然后将已排序的两个子数组归并成一个含有n个元素的有序数组.
2.与快速排序的联系
a.都是分治的思想.
b.经过一次划分之后,实现对A数组的调整:其中一个子集合的所有元素均小于等于另外一个子集合的所有元素.
C.快速排序按同样的策略对两个子集合进行分类处理.当子集合分类合并后,整个集合的分类也完成了.这个过程避免了子集合的归并操作.
3.图解排序过程(图片转自http://blog.csdn.net/collonn/article/details/17581953)
4.代码(java)
public class Mergesort {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] data = new int[] { 1, 14,31, 22, 66};
int size=data.length;
Mergesort(data,0,size-1);
for(int a=0;a<size;a++)
{
System.out.print(data[a]+" ");
}
}
private static void Mergesort(int[] data, int start, int end) {
// TODO Auto-generated method stub
if(start >= end)
return ;
int middle=(start+end) / 2;
Mergesort(data,start,middle);
Mergesort(data,middle+1,end);
Merge(data,start,middle,end);
}
//合并排序
private static void Merge(int[] data, int start, int middle, int end) {
// TODO Auto-generated method stub
//这边有个关键点,就是定义一个数组temp数组用来存放重新排序的值
int temp[]=new int[data.length];
int i=start;
int j=middle+1;
int p=start;
int tmp=start;
for(;(i<=middle) && (j<=end);p++)
{
if(data[i]>data[j])
{
temp[p]=data[j++];
}else
{
temp[p]=data[i++];
}
}
while(i <= middle)
{
temp[p++]=data[i++];
}
while(j <= end)
{
temp[p++]=data[j++];
}
while(tmp <= end)
{
data[tmp]=temp[tmp++];
}
}
}