算法导论第二章-练习2.3-2

用数组下表限制数组越界

原题是用一个无穷大值做哨兵,另一中方法,用函数下表限制数组越界即可,用一个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条件语句改变赋值的方向

可能我讲的不是很明白 因为我不善于文字表达,如果看不懂可是试着去找一找归并排序的相关资料。

如果这篇文章浪费了你的时间 对不起!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

name大权子

有钱的捧个钱场

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值