破碎的合并排序

时间:2015-11-13 08:00:43

标签: sorting struct segmentation-fault mergesort

早上好,Stack Overflow。你们帮我解决了早先的任务,我希望能得到一点帮助。

这是与排序相关的编程任务,其中一部分是编写合并排序的工作实现。

我从教授在课堂上使用的伪代码中调整了我的解决方案,但是我在指定位置遇到了令人讨厌的段错误。

此方法对结构数组进行排序,其中data_t定义为struct指针。

结构定义:

typedef struct {
int id;
int salary;
} employee_t;

typedef employee_t* data_t;

他们按薪水排序,这是一个随机生成的数字,从40,000到90,000。

这是实际的方法

void merge_sort(data_t items[], size_t n)
{
if (n < 2)
  return;

size_t mid = (n / 2);

data_t *left = malloc(sizeof(data_t) * mid);
data_t *right = malloc(sizeof(data_t) * (n - mid));

for (int y = 0; y < mid; y++)
{
  left[y] = items[y];
}

for (int z = mid; z < n; z++)
{
  right[z] = items[z];
}

merge_sort(left, mid);
merge_sort(right, (n - mid));

size_t l, r, i;
l = 0;
r = 0;

for (i = 0; i < (n - 1); i++)
{
  if ((l < mid) && ((r >= (n - mid)) || ((left[l]->salary) <=  (right[r]->salary))))
  {
     items[i] = left[l++];
  }
  else
  { 
     items[i] = right[r++];
  }
}

free(left);
free(right);  
}

请注意,我还没有完成它,所以数组释放可能位置不正确。

当我尝试访问右[r] - &gt;工资时,总会出现段错误,所以我假设这与空指针或类似指针有关。但是,我对排序非常陌生,而且我不确切知道在哪里正确实施检查。

非常感谢任何建议。

1 个答案:

答案 0 :(得分:1)

乍一看有这个问题:

    for (int z = mid; z < n; z++)
    {
        right[z-mid] = items[z];
    }