在程序中找不到bug(Quicksort实现)

时间:2014-04-27 07:08:28

标签: c++ quicksort

出于某种原因,每当我尝试编译程序时,它都说“文件已停止工作”。它没有给出任何具体错误,所以我不知道出了什么问题。我看了很多次,找不到任何错误。

这是快速排序算法的实现。

int partition(int arr[], int left, int right) {
    int pivotPos = left + rand() % right;
    int pivot = arr[pivotPos];
    int p = left;
    swap(arr[pivotPos], arr[right]);

    for (int i = left; i < right; i++) {
        if (arr[i] <= pivot) {
            swap(arr[i], arr[p]);
            p++;
        }
    }
    swap(arr[p], arr[pivotPos]);
    return p;
}

void quickSort(int arr[], int left, int right) {
    if (left < right) {
        int partitionIndex = partition(arr, left, right);
        quickSort(arr, left, partitionIndex - 1);
        quickSort(arr, partitionIndex + 1, right);
    }
}

int main() {
    int theArr[10000];
    clock_t d1, d2;

    for (int i = 0; i < 10000; i++) {
        theArr[i] = 1 + rand() % 500;
    }

    for (int i = 0; i < 10; i++) {
        d1 = clock();
        quickSort(theArr, 0, 10000);
        d2 = clock();

        cout << "Time: " << ((double) (d2 - d1) / (CLOCKS_PER_SEC)) << endl;
    }

    return 0;
}

2 个答案:

答案 0 :(得分:0)

正如hvd在评论部分指出的那样,以下行显示错误。

int pivotPos = left + rand() % right;

您正在寻找的是:

int pivotPos = left + rand() % (right-left);

答案 1 :(得分:0)

我不明白你为什么要在循环结束后交换arr[p]arr[pivotPos]
pivotPos是数据透视的初始位置。枢轴的最终位置为p-1。在循环结束时,阵列已根据需要进行排列。这种交换只会使阵列更加偶然。因此,除了替换

int pivotPos = left + rand() % right;

通过

int pivotPos = left + rand() % (right - left);


取代

arr[right]

arr[right-1]

您还应该替换

swap(arr[p], arr[pivotPos]);
return p;

通过

return p-1;

并且,因为函数quickSort的第三个参数是<maximum index> + 1,所以递归调用

quickSort(arr, left, partitionIndex - 1);

应替换为

quickSort(arr, left, partitionIndex);