4.归并排序
归并排序也是采用分治思想。归并算法就是把两个或两个以上的有序表合并成为一个新的有序表。例如:
有序表1: 1 3 5
有序表2: 2 4
每次从两表的第一个元素中选取最小的元素排在新的有序表中。
两个有序表的归并过程:
①
有序表1: 3 5
有序表2: 2 4
新有序表:1
②
有序表1: 3 5 有序表2: 4
新有序表:1 2
③
有序表1: 5
有序表2: 4
新有序表:1 2 3
④
有序表1: 5
有序表2:
新有序表:1 2 3 4
⑤
有序表1:
有序表2:
新有序表:1 2 3 4 5
所以对一个序列,可以将它分成前后两个序列,子序列还可以分成前后两个子序列,依次直到子序列为前后两个元素,然后子序列进行归并,调整成为一个有序序列。
C语言:
//2路归并序列
void Merge(int *array,int low,int mid,int high)
{
int *base=(int *)malloc(sizeof(int)*(high-low+1));
if(!base)
exit(0);
for(int n=0;n<high-low+1;n++)
base[n]=array[low+n]; //复制数组
int i=low,j=mid+1,m=0;
while(i<mid+1||j<high+1) //归并两个序列
{
if((j>high)||(i<mid+1&&array[i]<array[j]))
base[m++]=array[i++];
else
base[m++]=array[j++];
}
for(n=0;n<high-low+1;n++)
array[low+n]=base[n];
free(base); //释放内存
}
void MergeSort(int *array,int low,int high)
{
if(array==NULL)
return;
if(low<high)
{
int mid=(low+high)/2;
MergeSort(array,low,mid); //归并左区间
MergeSort(array,mid+1,high);//归并右区间
Merge(array,low,mid,high);
}
}
Java语言:
public class MergeSort {
public static void merge(int array[], int low, int mid, int high) {
if (array == null)
return;
int temp[] = new int[high-low+1]; //辅助数组
int i=low,j=mid+1,m=0;
while(i<mid+1||j<high+1){ //排序
if(j>high||(i<mid+1&&array[i]<array[j]))
temp[m++]=array[i++];
else
temp[m++]=array[j++];
}
for(int n=0;n<high-low+1;n++) //将归并后的值赋给原数组
array[n+low]=temp[n];
}
public static void sort(int array[],int low,int high) {
if(array==null)
return;
int mid=0;
if(low<high){
mid=(low+high)/2;
sort(array,low,mid); //排序左区间
sort(array,mid+1,high); //排右有区间
merge(array, low, mid, high);
}
}
}