在递归合并排序期间中止核心转储

问题描述

在通过引用传递时实现递归合并排序时遇到问题。 basic_merge_sort是main.cpp的入口点,在这里我按值传递,因为Im使用同一数组进行一堆排序。使用gcc和Makefile,我得到的错误是malloc(): invalid size (unsorted) Aborted (core dumped)。也可以使用Counter类中的静态成员来跟踪递归期间的比较。我也尝试不使用指针,而是使用静态类成员向量,但是没有运气。有什么想法或建议吗?预先感谢。

#include "merge.hpp"
#include "selection.hpp"

using namespace std;

int Counter::count{0}; //lets start count from 0

int basic_merge_sort(vector<double> holder_array) //entry point
{
    int end = holder_array.size() - 1;
    mpartition(&holder_array,end);
    return Counter::count;
}

void merge_sort(vector<double> *holder_array,int start,int end,int middle)
{
    int i = start,j = middle + 1,k = 0;
    vector<double> temp(end - start + 1,0.0); 

    while (i <= middle && j <= end)
    {
        if (holder_array->at(i) < holder_array->at(j))
        {
            temp[k] = holder_array->at(i); 
            k++;
            i++;
            Counter::count++;
        }
        else
        {
            temp[k] = holder_array->at(j);
            k++;
            j++;
            Counter::count++;
        }
    }

    while (i <= middle)
    {
        temp[k] = holder_array->at(i);
        k++;
        i++;
        Counter::count++;
    }

    while (j <= end)
    {
        temp[k] = holder_array->at(j);
        k++;
        j++;
        Counter::count++;
    }
    for (i = start; i <= end; i++)
    {
        holder_array->at(i) = temp[i - start];
    }
}

void mpartition(vector<double> *holder_array,int end)
{
    int middle;
    if (start < end)
    {
        middle = (start + end) / 2;
        mpartition(holder_array,start,middle);
        mpartition(holder_array,middle + 1,end);
        merge_sort(holder_array,end,middle);
    }
}

解决方法

您的代码中存在多个问题:

  • 您不是通过引用传递向量:basic_merge_sort会获取向量的副本,因此不会对传递给它的数组进行排序,而只是对副本进行排序。
  • mpartition使用指向向量的指针,该向量与通过引用传递的向量并不完全相同。
  • 排除end的约定很容易混淆并且容易出错,您应该在C ++中使用更惯用的约定,并考虑将上限排除在外。

这是修改后的版本:

#include "merge.hpp"
#include "selection.hpp"

using namespace std;

int Counter::count{0}; //lets start count from 0

int basic_merge_sort(vector<double>& array)
{
    mpartition(array,array.size());
    return Counter::count;
}

void merge_sort(vector<double>& array,size_t start,size_t middle,size_t end)
{
    size_t i = start,j = middle,k = 0;
    vector<double> temp(end - start,0.0); 

    while (i < middle && j < end) {
        if (array[i] < array[j]) {
            temp[k++] = array[i++]; 
            Counter::count++;
        } else {
            temp[k++] = array[j++];
            Counter::count++;
        }
    }

    while (i < middle) {
        temp[k++] = array[i++];
        Counter::count++;
    }

    while (j < end) {
        temp[k++] = array[j++];
        Counter::count++;
    }
    for (i = start; i < end; i++) {
        array[i] = temp[i - start];
    }
}

void mpartition(vector<double>& array,size_t end)
{
    if (end - start >= 2) {
        size_t middle = start + (end - start) / 2;
        mpartition(holder_array,start,middle);
        mpartition(holder_array,middle,end);
        merge_sort(holder_array,end);
    }
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...