算法核心:
mark1 mark2分别用来标记两个子段
每次把mark1 和mark2 中更小的放进去,放完即合并完毕~
void G(int *head,int *temp,int start,int end){
//head 为待排序序列 temp为暂存数组
//start和end 表示从start到end之间进行排序
int mark1,mark2; //两子段合并时用的的标记变量
if(start+1==end){ //递归出口
if(head[start]>head[end]){
int temp=head[start];
head[start]=head[end];
head[end]=temp;
}
return;
}
if((end-start)%2!=0){ //把序列分成两子段——分治思想
mark1=0;mark2=(end+start)/2+1;
G(head,temp,start,(start+end)/2);
G(head,temp,(start+end)/2+1,end);
}
else { //当待排序数字的数目为奇数时,留下末尾的一个元素
mark1=0;mark2=end;
G(head,temp,start,end-1);
}
for(int i=start,j=0;j<=end-start;j++,i++){
temp[j]=head[i];
}
int mid=(end+start)/2+1; //防止mark1越界到第二个字段
for(int i=start;i<=end;i++){
if(mark2<=end&&mark1<mid&&temp[mark1]<=temp[mark2]){
head[i]=temp[mark1];
mark1++;
}
else if(mark2<=end){
head[i]=head[mark2];
mark2++;
}
else {
head[i]=temp[mark1];
mark1++;
}
}
return;
}
来源:CSDN
作者:岚月丶
链接:https://blog.csdn.net/a10201516595/article/details/103656285