Quicksort不使用大型数组

时间:2017-02-15 17:31:42

标签: c++ arrays quicksort partitioning

我正在尝试使用Hoare分区实现快速排序算法,该算法可以使用大量数组。它适用于小型阵列,但是在创建大型阵列时,应用程序会停止工作。有人可以帮忙吗?

实施如下: QuickSort.h

void SerialQuicksort(T* first, T* last, T* myArray, int size) {
    if (last - first>1) {
        T* mid = ModifiedHoare(myArray, first, last);
        SerialQuicksort(first, mid+1, myArray, size);
        SerialQuicksort(mid+1, last, myArray, size);
    }
} 

分区功能:

    int* ModifiedHoare(int* a, int* p, int* r)
{
    if (*p>*r)
        swapp(p, r); // Sentinel at both ends
        int x = *p; // x stores the pivot and location p is vacant now.
        while (1)
        {
            do{
                *r--;
            } while (*r>x); // search the smaller   element in right
                // portion.
                *p = *r; // location r is vacant now.
                do{
                    *p++;
                } while (*p<x); // search the larger element in left portion.
                    if (p<r)
                        *r = *p; // location p is vacant now.
                    else{
                    if (*(r + 1) <= x)
                        r++;
                    *r = x;
                    return r; // return the location of the pivot
                }
        }
}

inline void swapp(int* x, int* y)
{
    int temp = *x;
    *x = *y;
    *y = temp;
}

测试 - 主要

#define SIZE 20000
int* myArray = new int[SIZE];
for (int i = 0; i < SIZE; i++)
{
    *(myArray + i) = rand();
}

parallelQuick.SerialQuicksort(&myArray[0], &myArray[SIZE-1], myArray, SIZE);

屏幕输出: enter image description here

调试应用程序时,会出现以下异常:

访问冲突写入位置0x00140F64

#define SIZE 356

Number of calls Exception popup window

1 个答案:

答案 0 :(得分:0)

您可以通过将堆栈保留大小(在配置属性&gt;链接器&gt;系统中)设置为更高的值来增加堆栈大小,但如果递归太深,这将无济于事。