为什么我的最终向量应该是它应该是的两倍并且领先于0?

时间:2018-04-04 21:16:02

标签: c++

我正在为一个类做这个小项目而且我已经完成了它但是由于某种原因我的合并向量是它应该的大小的两倍并且具有不应该存在的前导0。主要功能是为我们编写的,我们必须编写分区,快速排序和multiway_merge函数。首先,程序应该记录列表的数量,每个列表中的整数,然后是键盘中每个列表中的数字。然后我们使用快速排序和分区功能快速对每个列表进行排序。分区函数中的轴应该是列表中第一个,中间和最后一个元素的中位数。排序后,我们使用multiway_merge函数合并排序列表。我已经得到它来排序列表并合并它们但由于某种原因我得到的最终向量应该是它的大小的两倍,并且它的前半部分是0' s。如果你们能帮助我解决这个问题,那就太棒了!

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <queue>

using namespace std;

int partition(vector<int>& list, int first, int last) {
    // The pivot should be the median of the
    // first, middle, and last elements.
    int pivot;
    int index, smallIndex;
    int middle = floor(list.size() / 2);

    int arr[3] = {first, middle, last};
    int size = sizeof(arr) / sizeof(arr[0]);
    sort(arr, arr + size);

    swap(first, arr[1]);
    pivot = list[first];
    smallIndex = first;

    for(index = first + 1; index <= last; index++)
        if(list[index] < pivot) {
            smallIndex++;
            swap(smallIndex, index);
        }

    swap(first, smallIndex);
    return smallIndex;
}

void quicksort(vector<int>& list, int first, int last) {
    if(first == last)
        return;

    else {
        int pivotLocation = partition(list, first, last);
        quicksort(list, first, pivotLocation - 1);
        quicksort(list, pivotLocation + 1, last);
    }
}

void multiway_merge(vector<vector<int> >& input_lists, 
vector<int>& output_list) {
    int size = input_lists.size();
    int s = input_lists[0].size();
    priority_queue<int, vector<int>, greater<int> > minHeap;

    for(int i = 0; i < size; i++) {
        for(int j = 0; j < s; j++) {
            minHeap.push(input_lists[i][j]);

            if(minHeap.size() > size) {
                output_list.push_back(minHeap.top());
                minHeap.pop();
            }
        }
    }

    while(minHeap.size()) {
        output_list.push_back(minHeap.top());
        minHeap.pop();
    }
}

int main(int argc, char** argv) {
    int n, m;
    cin >> n >> m;

    vector<vector<int> > input_lists(n, vector<int>(m));

    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            cin >> input_lists[i][j];
        }
    }

    // Quicksort k sublists
    for (int i = 0; i < input_lists.size(); ++i)
        quicksort(input_lists[i], 0, m-1);

    // Merge n input sublists into one sorted list
    vector<int> output_list(n * m);
    multiway_merge(input_lists, output_list);

    for (int i = 0; i < output_list.size(); ++i)
        cout << output_list[i] << " ";
    cout << endl;
}

1 个答案:

答案 0 :(得分:1)

vector<int> output_list(n * m);output_list初始化为大小n*m并填充0。然后你会push_back之后的值。

您有3个选项:

  1. 请勿初始化output_list以获取值。让程序保留空间push_back

  2. 请勿使用edited example on JSFiddle初始化output_list以获取值,而是增加容量

  3. 按原样初始化output_list,但不要在函数中push_back。而是修改索引的值而不是添加更多。