(1)算法思路
基本操作是:合并两个排序好的表,将输出放在辅助数组里面
一次归并的过程,和合并两个有序链表几乎是一样的:
初始状态:
(1)1<2,那么将A所指元素放入辅助数组,再令A++,C++;
(2)13>2,那么将B所指元素放入辅助数组,再令B++,C++;
![在这里插入图片描述](https://img-blog.csdnimg.cn/20190802153029830.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTU0MzM3,si
ze_16,color_FFFFFF,t_70)(3)
该算法的思想是递归思想中的分治策略:
下面是代码实现
#include <stdio.h>
typedef int ElemType;
void Merge(ElemType *a,ElemType aux[],int start,int center,int end){
int i = start; //指向前半部分第一个元素
int j = center+1;//指向后半部分第一个元素
int k = 0;//指向辅助数组第一个元素
while(i<=center&&j<=end){
if(a[i]<=a[j]){
aux[k]=a[i];
i++;k++;
}else{
aux[k]=a[j];
j++;k++;
}
}
//将剩余部分加入
while(i<=center){
aux[k]=a[i];
i++;k++;
}
while(j<=end){
aux[k]=a[j];
j++;k++;
}
//把排序好的部分返还赋值给a
for(i = 0,j=start; i < end-start+1; i++) {
a[j] = aux[i];
j++;
}
}
void MSort(ElemType *a,ElemType aux[],int start,int end){
int center;
if(start<end){
center = (start+end)/2;
MSort(a,aux,start,center);//对左半部分排序
MSort(a,aux,center+1,end);//对右半部分排序
Merge(a,aux,start,center,end);//合并
}
}
//测试
int main(){
int a[10]={23,45,35,7,18,102,65,71,14,1};
int aux[10]={0};
MSort(a,aux,0,9);
for(int i=0;i<10;i++){
printf("%d ",a[i]);
}
return 0;
}