用数组下表限制数组越界
原题是用一个无穷大值做哨兵,另一中方法,用函数下表限制数组越界即可,用一个if判断来写
直接上代码 讲可能讲不太清楚
#include<stdio.h>
void Mergesort(int number[],int p,int r);
void Merge(int number[],int p,int q,int r);
int main(void) {
int number[11]={0,3,5,4,1,2,7,8,6,10,9};
Mergesort(number,1,10);
for(int i=1;i<=10;i++) {
printf("%d ",number[i]);
}
}
void Mergesort(int number[],int p,int r) {
int q;
if(p<r) {
q=(p+r)/2;
Mergesort(number,p,q);
Mergesort(number,q+1,r);
Merge(number,p,q,r);
}
}
void Merge(int number[],int p,int q,int r) {
int n1=q-p+1;
int n2=r-q;
int a1[n1+1],a2[n2+1];
for(int i=1;i<=n1;i++) {
a1[i]=number[p+i-1];
}
for(int i=1;i<=n2;i++) {
a2[i]=number[q+i];
}
int i=1,j=1;
for(int k=p;k<=r;k++) {
if(i<=n1&&j<=n2) {
if(a1[i]>a2[j]) {
number[k]=a2[j++];
} else {
number[k]=a1[i++];
}
} else if(i>n1) {
number[k]=a2[j++];
} else if(j>n2) {
number[k]=a1[i++];
}
}
}
注意这里的代码
if(i<=n1&&j<=n2) {
if(a1[i]>a2[j]) {
number[k]=a2[j++];
} else {
number[k]=a1[i++];
}
} else if(i>n1) {
number[k]=a2[j++];
} else if(j>n2) {
number[k]=a1[i++];
}
我用if条件来防止数组越界,例如当左边比较完毕后,右边不再比较直接按顺序加入原数组中
其实对于归并排序,左右有顺序的两部分比较到最后必然会有一个用完了,即所有的值全部付给了原数组,这时候为了避免数组越界,我们必须用if条件语句改变赋值的方向
可能我讲的不是很明白 因为我不善于文字表达,如果看不懂可是试着去找一找归并排序的相关资料。
如果这篇文章浪费了你的时间 对不起!!!!