损坏的归并排序
Broken Merge Sort
早上好,Stack Overflow。你们帮助我完成了较早的任务,我希望在这件事上能得到一点帮助。
这是一项与排序相关的编程作业,其中一部分是编写归并排序的工作实现。
我根据教授在 class 中使用的伪代码改编了我的解决方案,但我在指定位置遇到了一个恼人的段错误。
此方法对结构数组进行排序,data_t 定义为结构指针。
结构定义:
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);
}
请注意,我还没有走到尽头,因此数组释放位置可能不正确。
当我尝试访问 right[r]->salary 时,总是会出现段错误,因此我假设这与空指针或类似内容有关。但是,我对排序非常陌生,我不知道在哪里正确地执行检查。
非常感谢任何建议。
乍一看有这个修复:
for (int z = mid; z < n; z++)
{
right[z-mid] = items[z];
}
早上好,Stack Overflow。你们帮助我完成了较早的任务,我希望在这件事上能得到一点帮助。
这是一项与排序相关的编程作业,其中一部分是编写归并排序的工作实现。
我根据教授在 class 中使用的伪代码改编了我的解决方案,但我在指定位置遇到了一个恼人的段错误。
此方法对结构数组进行排序,data_t 定义为结构指针。
结构定义:
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);
}
请注意,我还没有走到尽头,因此数组释放位置可能不正确。
当我尝试访问 right[r]->salary 时,总是会出现段错误,因此我假设这与空指针或类似内容有关。但是,我对排序非常陌生,我不知道在哪里正确地执行检查。
非常感谢任何建议。
乍一看有这个修复:
for (int z = mid; z < n; z++)
{
right[z-mid] = items[z];
}