一
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循環(huán)中對索引進行操作,必須添加索引不越界的條件
二
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 循環(huán),j 最多增加 1,條件判斷,防止越界
//若是加入 while 循環(huán),要在 for 內(nèi)部對 j 進行判斷,防止 j
// 增加多位,發(fā)生越界訪問
A[i++]=B[j++]; //而且 先判斷 C 段,再判斷 B段,減少一個條件 j<jb
}
delete [] B;
}
在Merge函數(shù)中,for中嵌套if語句,要保證每次索引j
操作的增量都不大于一,可以不在 if中判斷越界。