在我决定将数组更改为向量之前,我的程序一直运行,现在它一直在产生分段错误,而不是输出排序后的向量,我不知道为什么。
#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;
}
我是编程新手,这很可能是我的愚蠢错误,但是我很想了解为什么会这样。
答案 0 :(得分:1)
您的向量大小为零。更改
vector<int> mergedNumbers;
到
vector<int> mergedNumbers(mergedSize);
或者在向矢量添加项目时使用push_back
。
就像数组一样,向量不会自动调整其大小。如果要更改向量的大小,必须使用push_back
或resize
之类的方法。
您的代码还有另一个问题。您正在按值传递向量,这意味着您正在对向量的副本进行排序,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
}