我正在实现一种算法来选择数组的第K个最小元素。到目前为止,当我试图免费堆内存我得到这个错误:CRT检测应用程序堆缓冲区结束后写信给记忆......在递归函数中释放内存时发生堆损坏
int SEQUENTIAL_SELECT(int *S , int k , int n)
{
if(n<=Q) // sort S and return the kth element directly
{
qsort(S,n,sizeof(int),compare);
return S[k];
}
// subdivide S into n/Q subsequences of Q elements each
int countSets = ceil((float)n/(float)Q);
//sort each subsequnce and determine its median
int *medians = new int[countSets];
for(int i=0;i<countSets;i++)
{
if(i==countSets-1)
{
int size = Q - (n%Q);
qsort(&S[Q*i],size,sizeof(int),compare);
medians[i] = S[i*Q+size/2];
continue;
}
qsort(&S[Q*i],Q,sizeof(int),compare);
medians[i] = S[i*Q+Q/2];
}
// call SEQUENTIAL_SELECT recursively to find median of medians
int m = SEQUENTIAL_SELECT(medians,countSets/2,countSets);
delete[] medians;
int size = (3*n)/4;
int* s1 = new int[size]; // contains values less than m
int* s3 = new int[size]; // contains values graten than m
for(int i=0;i<size;i++)
{
s1[i] = INT_MAX;
s3[i] = INT_MAX;
}
int i1=0;
int i2=0;
int i3=0;
for(int i=0;i<n;i++)
{
if(S[i]>m)
s3[i3++] = S[i];
else if(S[i]<m)
s1[i1++] = S[i];
else
i2++; // count number of values equal to m
}
if(i1>=k)
m = SEQUENTIAL_SELECT(s1,k,i1);
else if(i1+i2+i3 >= k)
m = SEQUENTIAL_SELECT(s3,k-i1-i2,i3);
delete[] s3;
delete[] s1;
return m;
}
**其中**错误是否完全发生?尝试在'valgrind'或类似的内存调试器中运行应用程序。 –
为什么使用'new int []'而不是'std :: vector'? (编辑:行'int size = Q - (n%Q);'看起来对我不正确。) –
DCoder
我想在CUDA程序中使用这个函数,很遗憾,你不能在CUDA内核中使用std :: vector – nasir