循环语句的小建议

int partition(int num[],int lo,int hi)
{
    swap(num[lo],num[rand()%(hi-lo+1)+lo]);
    int pivot=num[lo];
    while(lo<hi)
    {
        while(lo<hi && pivot<=num[hi]) hi--;
        num[lo]=num[hi];
        while(lo<hi && pivot>=num[lo]) lo++;
        num[hi]=num[lo];
    }
    num[lo]=pivot;
    return lo;
}

如果在while循环中对索引进行操作,必须添加索引不越界的条件

void Merge(int num[],int lo,int mid,int hi)
{
    int A[]=num+lo;
    int la=hi-lo;
    int lb=mid-lo;
    int B[]=new int[lb];  //----------------------
    for(int i=0;i<lb;i++)
        B[i]=A[i];
    int C[]=num+mid;
    int lc=hi-mid;
    
    for(int i=0,j=0,k=0;j<lb;)
    {       
        if(k<lc && B[j]>=C[k])  //防止越界访问
            A[i++]=C[k++];
        if(k>=lc || B[j]<C[k])  //使用 if 不使用 while 
                                //每一次 for 循环,j 最多增加 1,条件判断,防止越界
                                //若是加入 while 循环,要在 for 内部对 j 进行判断,防止 j
                                // 增加多位,发生越界访问
            A[i++]=B[j++];      //而且 先判断 C 段,再判断 B段,减少一个条件 j<jb
        
    }
    
    delete [] B;
}

在Merge函数中,for中嵌套if语句,要保证每次索引j操作的增量都不大于一,可以不在 if中判断越界。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,803评论 18 399
  • 第一部分 打好基础 Laying the Foundation 第一章 欢迎进入软件构建的世界 Welcome t...
    白桦叶阅读 4,713评论 0 17
  • 小编费力收集:给你想要的面试集合 1.C++或Java中的异常处理机制的简单原理和应用。 当JAVA程序违反了JA...
    八爷君阅读 4,692评论 1 114
  • Powerful WORD processor. Create, open (import) and edit M...
    KonSouth09阅读 371评论 0 0
  • “看清一个人又何必去揭穿; 讨厌一个人又何必去翻脸。 活着,总有看不惯的人,就如别人看不惯我们。 人的成熟不是年龄...
    悬壶者帅帅阅读 207评论 0 0