【发布时间】:2012-01-03 04:16:17
【问题描述】:
我正在编写一个简单的合并排序函数来根据给定的 compar 函数进行排序:
void merge(int left, int mid, int right, int(*compar)(const void *, const void *))
{
// sublist sizes
int left_size = mid - left + 1;
int right_size = right - mid;
// counts
int i, j, k;
// create left and right arrays
B *left_list = (B*) malloc(left_size*sizeof(B));
B *right_list = (B*) malloc(right_size*sizeof(B));
// copy sublists, could be done with memcpy()?
for (i = 0; i < left_size; i++)
left_list[i] = list[left + i];
for (j = 0; j < right_size; j++)
right_list[j] = list[mid + j + 1];
// reset counts
i = 0; j = 0;
for (k = left; k <= right; k++)
{
if (j == right_size)
list[k] = left_list[i++];
else if (i == left_size)
list[k] = right_list[j++];
// here we call the given comparision function
else if (compar(&left_list[i], &right_list[j]) < 0)
list[k] = left_list[i++];
else
list[k] = right_list[j++];
}
}
void sort(int left, int right, int(*compar)(const void *, const void *))
{
if (left < right)
{
// find the pivot point
int mid = (left + right) / 2;
// recursive step
sort(left, mid, compar);
sort(mid + 1, right, compar);
// merge resulting sublists
merge(left, mid, right, compar);
}
}
然后我使用不同的比较函数在同一个 list 数组上多次调用它。我发现第一次调用的排序是稳定的,但之后我看到元素被交换了,即使它们是相等的。
谁能提出这种行为的原因?
【问题讨论】:
-
什么是
list?为什么有malloc而没有free? -
与您的问题无关,但您可能希望释放在
merge函数中分配的内存。 -
compar(&left_list[i], &right_list[j]) <= 0(将比较更改为 -
顺便问一下
B是什么类型的? -
我需要添加 free() 是的,这可能是多次重新调用函数时出现奇怪行为的原因吗?