我的 quickSort() 程序不能正常工作,为啥? [关闭]

Posted

技术标签:

【中文标题】我的 quickSort() 程序不能正常工作,为啥? [关闭]【英文标题】:My quickSort() program cannot work well, why? [closed]我的 quickSort() 程序不能正常工作,为什么? [关闭] 【发布时间】:2015-11-15 07:20:18 【问题描述】:

如果你能帮助我,真的很感谢!下面是我对数字向量(双精度型)进行排序的代码。 vec中的元素个数是200,000。

程序在几秒钟后停在绿线处。错误信息是

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

就像图片一样:

/*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:EXC_BAD_ACCESS (code = 2, address=0x7fff5f3fffd8)”。程序停在绿线处。 @WBLee 使用Insturments中的Zombie工具找出问题的原因,更多细节:***.com/a/11717981/2128327 【参考方案1】:

首先,这里是错误的:

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

你丢失了vec[pivot] 的内容,之后在这里if (vec[i] &lt;= vec[start]) 你 按vec[start] 的值对你的向量排序,然后pivot 是开始,那么到底为什么, 您将枢轴设置为(start + end) / 2;?当你在比较中使用 NO 保存 值,但从vec[start]重新读取,可以通过向量中的swap操作改变。毕竟你订购了start,但是你的索引在订购周期for (int i = start + 1; i &lt;= end; i++)中增加了,所以在迭代之后你 有(当然,如果以前的错误已修复): pivot, sub array &lt;= pivot, sub array &gt; pivot,所以你需要而不是只是 swap 如果从 endstart + 1 你需要移动 sub array &lt;= pivotstart 并插入 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));

注意:我使用c++11(initializer_list),但仅用于测试,因此无需测试您可以重用c++98c++03

【讨论】:

以上是关于我的 quickSort() 程序不能正常工作,为啥? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 C 程序不能正常工作?

为啥我的 pygame 应用程序循环不能正常工作? [复制]

preventDefault() 不能正常工作

嵌套回调函数不能正常工作 swift

onNewIntent(intent) 不能正常工作

onNewIntent(intent) 不能正常工作