C中的合并排序算法工作不正常
我试图实现一个合并排序函数,但是,输出(排序)变得不正确。我还需要解释函数的作用。我试图通过调试进行故障排除,但找不到问题。我不知道你的解释是否足以帮助我!请注意,我可能不会更改mergeSort参数C中的合并排序算法工作不正常,c,C,我试图实现一个合并排序函数,但是,输出(排序)变得不正确。我还需要解释函数的作用。我试图通过调试进行故障排除,但找不到问题。我不知道你的解释是否足以帮助我!请注意,我可能不会更改mergeSort参数 int lessThan(int element1, int element2, Statistics* statistics); 如果元素1
int lessThan(int element1, int element2, Statistics* statistics);
如果元素1<元素2,则为True
int lessThanOrEqualTo(int element1, int element2, Statistics* statistics);
如果element1采用可能出现问题的最小数组,则为True,然后使用调试器在监视变量及其值的同时逐语句逐步执行代码语句。这是解决此类问题的常用方法。请密切注意数组索引和数组的限制(因为越界是一个常见问题)。我还建议您为变量使用更多描述性名称<代码>左侧和
左侧
?这非常令人困惑(取决于字体可能甚至无法区分)。您没有显示ElementType或Statistics的typedef
。统计信息对排序/合并行为有什么影响(如果有)?如果答案为“无”,则将其从示例中删除,以获得最小的可复制示例。您的统计对象可能用于计算您进行的比较次数。这些比较是决定两个元素如何相关的比较,即两个元素中的哪一个应该在排序数组中位于第一位。它们比较ElementType*
的两个元素。我认为在比较数组索引时不应该使用这些函数。您的代码应该只调用一次lessThan
:当您决定两个非空子列表的头元素中的哪一个首先出现时。(无论您对哪种类型的元素进行排序,索引比较始终是相同的。项目比较对于分类算法很重要:您比较元素的频率有多高?您复制元素的频率有多高?这些信息以及比较或元素副本的成本或检查信息可以帮助您确定哪种排序。)(要使用的g算法。)
ElementType* arrayToSort
static void mergeSort(ElementType* arrayToSort, unsigned int size, Statistics* statistics){
ElementType* arr = (ElementType*)malloc(sizeof(ElementType) * size);
if (arr == NULL) {
free(arr);
return;
}
else {
Sort(arrayToSort, statistics, arr, 0, size - 1);
free(arr);
}
}
static void merge(ElementType* arrayToSort, ElementType* arr, Statistics* statistics, int left, int
right, int mid) {
int index, Left, Right;
for (index = left, Left = left, Right = mid + 1; lessThanOrEqualTo(Left, mid, statistics) &&
lessThanOrEqualTo(Right, right, statistics); index++) {
if (lessThanOrEqualTo(arrayToSort[Left], arrayToSort[Right], statistics)) {
arr[index] = arrayToSort[Left++];
}
else {
arr[index] = arrayToSort[Right++];
}
}
while (lessThanOrEqualTo(Left, mid, statistics)) {
arr[index++] = arrayToSort[Left++];
}
while (lessThanOrEqualTo(Right, right, statistics)) {
arr[index++] = arrayToSort[Right++];
}
for (index = Left; lessThanOrEqualTo(index, Right, statistics); index++) {
arrayToSort[index] = arr[index];
}
}
static void Sort(ElementType* arrayToSort, Statistics* statistics, ElementType* arr, int left, int
right) {
if (lessThan(left, right, statistics)) {
int mid = (left + right) / 2;
Sort(arrayToSort, statistics, arr, left, mid);
Sort(arrayToSort, statistics, arr, mid + 1, right);
merge(arrayToSort, arr, statistics, left, right, mid);
}
}