打算写一个快速排序的程序,想从网上找一些代码。
先找了一个c#的,改成vc的后,却发现经常导致非法操作,也没自己看源码,又去找了一个vc的代码。
看了看,好像和之前c#的没有大的区别,但是非法操作的情况依旧。
又从网上搜了一些源代码,仔细看了看。 发现这些代码出奇的相似,都忽略了在获取中点时的一个判断。
原来代码如下:
int pation(int data[], int x, int y)
{
int n=data[x], i=x+1, j=y, temp;
while(1)
{
while(data[i]<n) ++i;
while(data[j]>n) --j;
if(i>=j) break;
temp=data[i]; data[i]=data[j]; data[j]=temp;
}
data[x]=data[j];
data[j]=n;
return j;
}
修改后为:
int pation(int data[], int x, int y)
{
int n=data[x], i=x+1, j=y, temp;
while(1)
{
while(data[i]<n && i < y) ++i;
while(data[j]>n && j > x) --j;
if(i>=j) break;
temp=data[i]; data[i]=data[j]; data[j]=temp;
}
data[x]=data[j];
data[j]=n;
return j;
}
如果没有j > x或者i < y,就有可能出现i超出数组上界或者j小于0的情况,从而导致非法操作。
可见,网络上的资源固然丰富,但还是需要善用。