读书人

这段非递归的快速排序代码错哪了

发布时间: 2012-05-14 15:24:34 作者: rapoo

这段非递归的快速排序代码哪里错了?
写了个非递归的快速排序,建了个栈,没用模板库的,但下面主函数里第二种情况运行时会出错,在VS2010上编译,
错误是:HEAP CORRUPTION DETECTED:after Normal block(#88) at 0x00244E70
单步了好几次都没有发现,请高手帮看,要怎么修改??

C/C++ code
//划分函数template<class T>int Partition(T* a,int left,int right){    T pivot = *(a+right);    while(left<right)    {        while(*(a+left)<pivot && left<right)            left++;        if(left<right)            *(a+right--) = *(a+left);        while(*(a+right)>pivot && left<right)            right--;        if(left<right)            *(a+left++) = *(a+right);    }    *(a+left) = pivot;    return left;}//快速排序(非递归)template<class T>void sort(T* arr,int len){    if(len == 1)        return;    int left = 0;    int right = len - 1;    int *stack = new int[right-left+1];    int top = 0;    int mid;    stack[top++] = left;    stack[top++] = right;    while(top>0)    {        right = stack[--top];        left = stack[--top];        if(left<right)        {            mid = Partition(arr,left,right);            if(mid-left > right-mid)            {                stack[top++] = left;                stack[top++] = mid-1;                if (right > mid)                {                    stack[top++] = mid + 1;                    stack[top++] = right;                }            }            else            {                stack[top++] = mid + 1;                stack[top++] = right;                if(mid > left)                {                    stack[top++] = left;                    stack[top++] = mid - 1;                }            }        }    }    delete[] stack;}int _tmain(int argc, _TCHAR* argv[]){    //下面这个可以通过    int arr[] = {4,3,2};    sort(arr,3);    //print arr...    //这个不能通过    int arr2[] = {2,2,2};    sort(arr2,3);    //....    return 0;}


[解决办法]
楼主的stack开小了,在第二例里面,最多存放了4个吧,但是好像你只开辟了容量为3的数组,导致写入的位置错错了。所以delete的时候crash掉了

读书人网 >C++

热点推荐