合并排序分段故障c ++

时间:2014-08-18 03:19:18

标签: c++ algorithm sorting segmentation-fault

我正在尝试为我的算法分析类实现合并排序,每次运行它都会出现分段错误。我认为问题是当我在merge_sort函数中拆分向量但我找不到问题。帮助将非常感谢人们。

template <typename T>
std::vector<int> merge(std::vector<T>& A,std::vector<T>& B)
{
   int a_size = A.size();
   int b_size = B.size();
   std::vector<int> C(a_size+b_size,0);
   //int *c = new int[b_size+a_size];
   int i =0,j =0,k=0;
   while(i < a_size && j < b_size)
   {
        if(A[i]<B[j])
        {
            C[k] = A[i];
            k++;
            i++;
        }   
        else
        {
            C[k] = B[j];
            k++;
            j++;
            if(i!=a_size)
            {
                for(;i<a_size;i++,k++)
                {
                    //copy rest of a to c
                    C[k] = A[i];
                }
            }
            if(j != b_size)
            {
                for(;j<b_size;k++,j++)
                {
                    //copy the rest of b to c
                    C[k] = B[j];
                }
            }   
        }
    }
    return C;
}
// Merge sort implementation
template <typename T>
void merge_sort(std::vector<T>& vector)
{
    // TODO implement merge sort
    int vector_size = vector.size();
    int big_vector_index = 0;
    int half_size = (int)vector_size/2;
    int remainder = vector_size%2;
    std::vector<int> left(half_size,0);
    std::vector<int> right(half_size+remainder,0);
    for(int l = 0;big_vector_index<half_size;l++,big_vector_index++)
    {
        left[l] = vector[big_vector_index];
    }

    for(int m = 0;big_vector_index<vector_size;m++,big_vector_index++)
    {
        right[m] = vector[big_vector_index];
    }
    big_vector_index = 0;
    merge_sort(left);
    merge_sort(right);
    vector = merge(left,right);

}

1 个答案:

答案 0 :(得分:0)

我看了一下你的代码,其中大部分代码都是正确的。我不想为你做一些课程,但是正确方向的一些提示会有所帮助。

关于你得到的段错误的原始问题,PaulMcKenzie,Jim Lewis和Tahlil是对的,merge_sort()需要一个基本条件(基本情况)来检查递归是否应该继续,所以它没有& #39; t永远运行和/或直到你的计算机内存不足(这是你的情况)。通常,任何递归函数都应该有一个基本情况。

此外,您还应该查看合并功能。它具有正确的合并功能的所有部分,但它的某些部分比你想要的更早/更频繁地运行。我不想因为上课而给予太多的帮助,但是如果你解决了段错问题并且仍然得到了奇怪的答案,请看看它。

相关问题