我的quickSort()程序无法正常工作,为什么?

时间:2015-11-15 07:20:18

标签: c++ algorithm sorting debugging quicksort

如果你能帮助我,真的非常感谢!下面是我的代码来排序数字向量(类型为double)。 vec中的元素数量为200,000。

几秒钟后,程序停在绿线上。错误消息是

  

“线程1:EXC_BAD_ACCESS(代码= 2,地址= 0x7fff5f3fffd8)”。

就像图片一样:

enter image description here

/*This is block to call quickSort*/
void VectorDoubleSort:: sort(std::vector<double>& vec){
      int start = 0;
      int end = vec.size() - 1;
      quickSort(vec, start, end);
}




/*This block to fulfill the quickSort method*/
    void VectorDoubleSort:: quickSort(std::vector<double>& vec, int start, int end)
    {
        int pivot = (start + end) / 2;
        int smallIndex = start;

        if (start < end) {
            double tempA = vec[start];
            vec[pivot] = tempA;

            for (int i = start + 1; i <= end; i++) {
                if (vec[i] <= vec[start]) {
                    smallIndex += 1;
                    double tempB = vec[i];
                    vec[i] = vec[smallIndex];
                    vec[smallIndex] = tempB;
                }
            }

            double tempC = vec[start];
            vec[start] = vec[smallIndex];
            vec[smallIndex] = tempC;

            pivot = smallIndex;

            quickSort(vec, start, pivot - 1);
            quickSort(vec, pivot + 1, end);
        }
    }

1 个答案:

答案 0 :(得分:1)

首先,这是错误的:

int pivot = (start + end) / 2;
double tempA = vec[start];
vec[pivot] = tempA;

你遗失了vec[pivot]的内容,之后if (vec[i] <= vec[start])你丢失了 按vec[start]的值排序你的向量,然后开始pivot,然后为什么地狱, 你将枢轴设置为(start + end) / 2;?正如您在比较 NOT 时使用的那样 值,但从vec[start]重新读取,可以通过向量中的swap操作进行更改。毕竟你是针对start订购的,但你的索引在订购周期for (int i = start + 1; i <= end; i++)中有所增加,所以在迭代之后你 有(当然如果以前的错误是固定的): {pivotsub array <= pivotsub array > pivot},因此您需要而不仅仅是swap,如果从endstart + 1的索引需要移动{{} {1}}到sub array <= pivot并插入start之间, 因此,如果可以重复使用尽可能多的代码,那么正确的解决方案将是:

pivot

注意:我使用#include <algorithm> #include <cassert> #include <iostream> #include <iterator> #include <vector> namespace VectorDoubleSort { void sort(std::vector<double> &vec); void quickSort(std::vector<double> &vec, int start, int end); } void VectorDoubleSort::sort(std::vector<double> &vec) { if (vec.empty()) return; int start = 0; int end = vec.size() - 1; quickSort(vec, start, end); } /*This block to fulfill the quickSort method*/ void VectorDoubleSort::quickSort(std::vector<double> &vec, int start, int end) { if (start < end) { const double pivotVal = vec[start]; int smallIndex = end; for (int i = end; i > start; --i) { if (vec[i] >= pivotVal) { std::swap(vec[i], vec[smallIndex]); --smallIndex; } } std::swap(vec[start], vec[smallIndex]); const int pivot = smallIndex; quickSort(vec, start, pivot - 1); quickSort(vec, pivot + 1, end); } } bool test(const std::vector<double> &arr) { std::vector<double> good = arr; std::sort(good.begin(), good.end()); std::vector<double> my = arr; VectorDoubleSort::sort(my); std::copy(my.begin(), my.end(), std::ostream_iterator<double>(std::cout, ", ")); std::cout << "\n"; return my == good; } int main() { assert(test({})); assert(test({3., 1., 2., 17., 18., -1., -5.})); assert(test({3., 1., 2.})); assert(test({3., 2.})); assert(test({3.})); assert(test({3., 532523, 5235, 05325, 535, 5738157, 535, 501, 9780, 14})); } (initializer_list),但仅用于测试,因此如果没有测试,您可以重复使用c++11c++98