【问题标题】:merge sort algorithm in c [closed]c中的合并排序算法[关闭]
【发布时间】:2018-11-29 17:42:19
【问题描述】:

对于给定的输入1 5 4 2,这是 c 中合并排序的实现,我得到的输出为1 2 5 4 请明天是我的 sem 结束考试,这将非常有帮助 请帮助 我尽力调试了很多次,但我找不到错误,因为一切都在递归中 如果你能告诉我的错误就可以了 提前谢谢

#include<stdio.h>
#include<stdlib.h>
void merge(int* A, int* left, int* right, int nl, int nr) {
    int i = 0, j = 0, k = 0;
    while (i < nl&&j < nr) {
        if (left[i] < right[j]) {
            A[i] = left[j];
            i++;
            j++;

        }
        else {
            A[i] = right[k];
            i++;
            k++;
        }
    }
    while (j < nl) {
        A[i] = left[j];
        i++;
        j++;
    }
    while (k < nr) {
        A[i] = right[k];
        k++;
        i++;
    }
}
void mergesort(int* A, int n) {
    if (n < 2)
        return;
    int mid = n / 2;
    int* left = (int*)malloc(sizeof(int) * 4);
    int* right = (int*)malloc(sizeof(int) * 4);
    for (int i = 0; i < mid; i++) {
        left[i] = A[i];
    }
    for (int i = mid; i < n; i++) {
        right[i - mid] = A[i];
    }
    mergesort(left, mid);
    mergesort(right, n - mid);
    merge(A, left, right, mid, n - mid);
}


int main() {
    int* a = (int*)malloc(sizeof(int) * 4);
    a[0] = 1;
    a[1] = 5;
    a[2] = 4;
    a[3] = 2;
    //quicksort(a,0,3);
    mergesort(a, 4);
    printf("%d %d %d %d", a[0], a[1], a[2], a[3]);
}

【问题讨论】:

  • 除了改用mergesort之外,这和your quicksort question真的没有什么不同。调试仍然是 IMO 的关键。此外,您的代码中有很多内存泄漏。
  • 请排序章节将在印度明天晚上 11 点到来,我有考试请帮帮我
  • 你搞砸了i,j,k 索引。首先给它们起有意义的名称(例如 done、ll、rr ...)
  • 欢迎来到 StackOverflow。请按照您创建此帐户时的建议阅读并遵循帮助文档中的发布指南。 On topic、how to ask 和 ... the perfect question 在此处申请。 StackOverflow 不是设计、编码、研究或教程资源。
  • 我们在许多方面都是编程新手。这里最直接的问题是,您需要的帮助水平与 Stack Overflow 根本不匹配——但您接近。

标签: c algorithm sorting


【解决方案1】:

你有一些错误。只需更新您的 merge() 函数。有几点:

  • 使用i 作为left 数组的索引。
  • 使用j 作为right 数组的索引。
  • 使用k 作为A 数组的索引来分配排序值。
  • 当left[i] &lt; right[j]然后赋值A[k] = left[i]并增加k和i,你可以写成A[k++] = left[i++];。
  • else or left[i] &gt;= right[j] 然后赋值A[k] = right[j] 并递增k 和j,你可以写成A[k++] = right[j++];。
  • 同样使用free()释放malloc()分配的内存。
  • 每次您不需要left 和right 的大小为4。分别更新为mid 和n-mid。

    #include<stdio.h>
    #include<stdlib.h>
    void merge(int* A, int* left, int* right, int nl, int nr) {
        int i = 0, j = 0, k = 0;
        while (i < nl&&j < nr) {
            if (left[i] < right[j]) {
                A[k++] = left[i++];
            }
            else {
                A[k++] = right[j++];
            }
        }
        while (i < nl) {
            A[k++] = left[i++];
        }
        while (j < nr) {
            A[k++] = right[j++];
        }
    }
    void mergesort(int* A, int n) {
        if (n < 2)
            return;
        int mid = n / 2;
        int* left = (int*)malloc(sizeof(int) * mid);
        int* right = (int*)malloc(sizeof(int) * (n - mid));
        for (int i = 0; i < mid; i++) {
            left[i] = A[i];
        }
        for (int i = mid; i < n; i++) {
            right[i - mid] = A[i];
        }
        mergesort(left, mid);
        mergesort(right, n - mid);
        merge(A, left, right, mid, n - mid);
    
        free(left);
        free(right);
    }
    
    
    int main() {
        int* a = (int*)malloc(sizeof(int) * 4);
        a[0] = 1;
        a[1] = 5;
        a[2] = 4;
        a[3] = 2;
        //quicksort(a,0,3);
        mergesort(a, 4);
        printf("%d %d %d %d", a[0], a[1], a[2], a[3]);
    
        free(a);
    
        return 0;
    }
    

输出:

1 2 4 5

【讨论】:

  • 好的,我在做。
  • 我已经更新了我的答案。
  • 很好的修复。次要:代码可以进行 1 次分配:int* left = malloc(sizeof *left * n); int *right = left + mid; .... free(left);,但这与 OP 的方法不同。
  • 是的,没错
猜你喜欢
  • 2013-03-27
  • 1970-01-01
  • 2021-08-24
  • 2014-03-30
  • 2017-10-13
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多