有哪里理解不对或表述不清楚的地方请大佬指正
#include<iostream>
using namespace std;
const int m =100010;
int q[m],tem[m];//这里需要开辟一个新数组来装比较后的数据。
void gb(int q[],int l,int r){
if(l>=r)return;
int mid=l+r>>1;
int i=l,j=mid+1,k=0;//由参数导入数值,将整个数组分为两段,即q[l]到q[mid]和q[mid+1]到q[r].i、j作为这两段的指针,方便比较数字和移动至下一位。
gb(q,l,mid);gb(q,mid+1,r);//左右两边排序
while(i<=mid&&j<=r)//当i,j两个指针同时在对应的数组段中,开始比较两段数组中的数据。
if(q[i]<=q[j])tem[k++]=q[i++];//当i所在的数组段中数据小于等于j所在的数组段时,将i所指向的数组元素赋值给数组tem[k],否则就将j指向的素组元素赋值给tem[k]
else tem[k++]=q[j++];
while(i<=mid)tem[k++]=q[i++];//当i小于mid的情况时,说明i所在的数组段里的数自加不足mid还有剩余,所以将i/数组段里的数全部移到tem数组后
while(j<=r)tem[k++]=q[j++];//同理,j指向的数组段剩下的元素都大于i指向的数组段,于是就将剩下的一道tem数组后
for(i=l,j=0;i<=r;i++,j++)
q[i]=tem[j];//将tem数组内的元素搬到q数组中完成排序
}
int main(){int n;
cin>>n;
for(int i=0;i<n;i++)scanf("%d",&q[i]);
gb(q,0,n-1);
for (int i=0;i<n;i++)printf("%d ",q[i]);
return 0;}