“归并”的含义是将两个或两个以上的的有序表组合成一个新的有序表,这也是归并排序的核心,归并排序也属于递归排序算法类
算法的主要步骤:
( 1 ) 将待排序序列分成左右两部分。
( 2 ) 分别对左右两部分进行迭代排序。
( 3 ) 对左右两部分进行归并,归并后的结果就已排好序。
首先是归并,即将两个已经有序的序列合并为一个有序的序列
void Merge(ElemType array[],int start,int median,int end){
int low = start;
int high = median+1;
int index = 0;
int length = end - start + 1;
ElemType *temp_arr = NULL;
//动态分配空间
temp_arr = (ElemType*)malloc(length * sizeof(ElemType));
//比较两部分,将较小的元素存入新数组中
while(low <= median && high <= end){
if(array[low] <= array[high])
temp_arr[index++] = array[low++];
else
temp_arr[index++] = array[high++];
}
//将剩下的元素移动到新数组中
while(low <= median)
temp_arr[index++] = array[low++];
while(high <= end)
temp_arr[index++] = array[high++];
//将temp_arr中元素移动到原array中,并释放空间
memmove(&array[start],temp_arr,sizeof(ElemType)* length);
free(temp_arr);
}
接下来对待排序序列进行划分,并迭代左右两部分
void Msort(ElemType array[],int start,int end){
int median;
if(start < end){
//计算中间元素下标
median = start + ((end - start) >> 1);
//分别对左右两部分进行排序
Msort(array,start,median);
Msort(array,median + 1,end);
//对有序的两部分进行合并
Merge(array,start,median,end);
}
}
最后就是调用函数,对一个初始的序列进行排序
void merge_sort(ElemType array[],int length){
if(array == NULL || length == 0)
exit(-1);
Msort(array,0,length - 1);
}