我的合并排序代码有什么问题

时间:2015-04-09 12:58:27

标签: c

我正在学习编码,虽然我尝试编写合并排序算法(我们在分析课程中听到的但不是家庭作业)。我正在使用培训师向我们展示的伪代码,但我无法确定问题。有人有机会指出我正确的方向吗?

#include <stdio.h>
#include <stdlib.h>
typedef int T;


void merge(T _elem[], int lo, int mi, int hi)
{
    int lb = mi - lo, lc = hi - mi;


    T* B = (T* )malloc(sizeof(T)*lb);

    for (int i = 0; i < lb; i++) B[i] = _elem[i];


    T* C = _elem + mi;


    for (int i = 0, j = 0, k = 0; j < lb || k < lc;)
    {
        if (j < lb && (lc <= k || B[j] <= C[k])) _elem[i++] = B[j++];
        if (k < lc && (lb <= j || C[k] < B[j])) _elem[i++] = C[k++];
    }
    free(B);
}

void mergeSort(T _elem[], int lo, int hi)
{
    if (hi - lo < 2) return;
    int mi = (lo + hi) >> 1;
    mergeSort(_elem, lo, mi);
    mergeSort(_elem, mi, hi);
    merge(_elem, lo, mi, hi);
}

int main()
{
    T elem[19] = {53, 130, 120, 14, 206, 31, 380, 39, 402, 146, 491, 51, 54, 59, 722, 79, 82, 186, 92};
    mergeSort(elem, 0, 19);
    for (int i = 0; i < 19; i++)
        printf("%d\t", elem[i]);
    return 0;
}

1 个答案:

答案 0 :(得分:1)

我看到这个代码存在3个明显的问题,但请记住,我只是在出路时阅读,没有调试器。你应该调试它并看看。

  • 您的mergeSort()来电在范围内重叠。没有理由对中间元素进行两次排序,而且你想尽快摆脱元素并最终得到一个空集。
  • 当您填写B临时数组时,您没有将_elem编入索引,您应该偏移i+lo
  • 与上述相同,合并时不要将_elem编入索引。您应该使用i初始化lo,而不是始终从头开始。