为什么我的合并排序程序出现分段错误错误

时间:2020-09-25 15:14:44

标签: c++ arrays vector segmentation-fault

在我决定将数组更改为向量之前,我的程序一直运行,现在它一直在产生分段错误,而不是输出排序后的向量,我不知道为什么。

#include <iostream>
#include <vector>
using namespace std;

void Merge(vector<int> numbers, int i, int j, int k) {
   int mergedSize;                            
   int mergePos;                              
   int leftPos;                              
   int rightPos;                              
  

   mergePos = 0;
   mergedSize = k - i + 1;
   leftPos = i;                           
   rightPos = j + 1; 
                     
   vector<int> mergedNumbers;     
                                             
   
  
   while (leftPos <= j && rightPos <= k) {
      if (numbers[leftPos] < numbers[rightPos]) {
         mergedNumbers[mergePos] = numbers[leftPos];
         ++i;
      }
      else {
         mergedNumbers[mergePos] = numbers[rightPos];
         rightPos;
         
      }
      ++mergePos;
   }
   
 
   while (leftPos <= j) {
      mergedNumbers[mergePos] = numbers[leftPos];
      ++leftPos;
      ++mergePos;
   }
   
  
   while (rightPos <= k) {
      mergedNumbers[mergePos] = numbers[rightPos];
      ++rightPos;
      ++mergePos;
   }
   

   for (mergePos = 0; mergePos < mergedSize; ++mergePos) {
      numbers[i + mergePos] = mergedNumbers[mergePos];
   }
}
void MergeSort(vector<int> numbers, int i, int k) {
   int j;
   
   if (i < k) {
      j = (i + k) / 2;  
      

      MergeSort(numbers, i, j);
      MergeSort(numbers, j + 1, k);
      
      
      Merge(numbers, i, j, k);
   }
}

int main() {
   vector<int> numbers;
   numbers.push_back(10);
    numbers.push_back(2);
     numbers.push_back(78);
      numbers.push_back(4);
       numbers.push_back(45);
        numbers.push_back(32);
         numbers.push_back(7);
          numbers.push_back(11);
   const int NUMBERS_SIZE = 8;
   int i;
   
   cout << "UNSORTED: ";
   for(i = 0; i < NUMBERS_SIZE; ++i) {
      cout << numbers[i] << " ";
   }
   cout << endl;
   
   MergeSort(numbers, 0, NUMBERS_SIZE - 1);
   
   cout << "SORTED: ";
   for(i = 0; i < NUMBERS_SIZE; ++i) {
      cout << numbers[i] << " "; 
   }
   cout << endl;
   
   return 0;
}

我是编程新手,这很可能是我的愚蠢错误,但是我很想了解为什么会这样。

1 个答案:

答案 0 :(得分:1)

您的向量大小为零。更改

vector<int> mergedNumbers; 

vector<int> mergedNumbers(mergedSize); 

或者在向矢量添加项目时使用push_back

就像数组一样,向量不会自动调整其大小。如果要更改向量的大小,必须使用push_backresize之类的方法。

您的代码还有另一个问题。您正在按值传递向量,这意味着您正在对向量的副本进行排序,main中的原始向量将保持不变。请使用参考。

void Merge(vector<int>& numbers, int i, int j, int k) {

void MergeSort(vector<int>& numbers, int i, int k) {

编辑

还有两个看起来像错别字的错误

 if (numbers[leftPos] < numbers[rightPos]) {
     mergedNumbers[mergePos] = numbers[leftPos];
     ++i;
  }
  else {
     mergedNumbers[mergePos] = numbers[rightPos];
     rightPos;
     
  }

应该是

 if (numbers[leftPos] < numbers[rightPos]) {
     mergedNumbers[mergePos] = numbers[leftPos];
     ++leftPos;                // <-- here
  }
  else {
     mergedNumbers[mergePos] = numbers[rightPos];
     ++rightPos;               // <-- here  
  }
相关问题