c - 归并排序: Incorrect answer

标签 c sorting mergesort

我正在尝试实现“算法简介”一书中所述的合并排序算法。 尽管实现是按照书中指定的,但输出不正确。 很有可能出现相差一的错误,但我无法指出它。 有什么指点吗?

#include <stdio.h>
#include <stdlib.h>
#define SENTINEL 32767

int* getArray(int size) {
    int* arr;
    int i;

    arr = (int*) malloc(sizeof(int) * size);

    printf("\nEnter %d elements:\n\n", size);

    for (i = 0; i < size; ++i) {
        scanf("%d", (arr + i));
    }

    printf("\n");

    return arr;
}

void printArray(int* arr, int size) {
    int i;
    printf("Array[%d]: ", size);
    for (i = 0; i < size; ++i) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

void merge(int* arr, int p, int q, int r) {
    int i, j, k, n1, n2;
    int* left;
    int* right;

    n1 = q - p;
    n2 = r - q;

    left  = (int*) malloc(sizeof(int) * (n1 + 1));
    right = (int*) malloc(sizeof(int) * (n2 + 1));

    left[n1] = right[n2] = SENTINEL;

    for (i = 0; i < n1; ++i) {
        left[i] = arr[p + i];
    }

    for (j = 0; j < n2; ++j) {
        right[j] = arr[q + j];
    }

    i = j = 0;

    for (k = p; k < r; ++k) {
        if (left[i] <= right[j]) {
            arr[k] = left[i++];
        } else {
            arr[k] = right[j++];
        }
    }

}

void mergeSort(int* arr, int p, int r) {
    if (p < r) {
        int q = (p + r) / 2;
        mergeSort(arr, p, q);
        mergeSort(arr, q + 1, r);
        merge(arr, p, q, r);
    }
}

int main() {
    int* arr;
    int size;

    printf("Enter array size: ");
    scanf("%d", &size);

    arr = getArray(size);
    printArray(arr, size);

    mergeSort(arr, 0, size);
    printArray(arr, size);

    return 0;
}

最佳答案

mergeSort 必须采用以下方式,原因已在注释中说明。

void mergeSort(int* arr, int p, int r) {
    if (r - p > 1) {//for call(a, 0, 1) -> call(a, 0, 1)
        int q = (p + r) / 2;
        mergeSort(arr, p, q);
        mergeSort(arr, q, r);
        merge(arr, p, q, r);
    }
}

还需要free(left);free(right);free(arr);

关于c - 归并排序: Incorrect answer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25191592/

相关文章:

c# - 用于快速过滤的 .net 集合(排序集合)

java - 从单词数组中搜索单词中的子单词?

java - 排序列表<Map<String, Object>>

java - 我用 Java 编写的合并排序程序无法运行?

algorithm - 算法的运行时间和输入大小如何告诉您算法的时间复杂度?

c - 测试 strstr 是否返回有效指针

c - 为什么 FLT_MIN 等于零?

c - Head First C string.h相关问题

c - STM32CubeMX HAL_xxx_MspInit()函数中的MSP代表什么?

java - 使用合并排序(递归)按字母顺序对名称进行排序